Bash获取最后一行的第一个单词

3

我有一个bash脚本,开始编写更新日志以跟踪更改。

我在脚本中添加了一个函数,它会回显"Script version --> ",但我必须手动编辑它。

所以我需要一个函数来获取最后一行的第一个单词直到空格,并将其存储为$CURRENTVERSION

更新日志语法如下:

v-0.3.2 Added x, y.

v-0.3.2.1 Fixed y.

v-0.4 Added z.

简而言之,我需要将v-0.4存储为$CURRENTVERSION
4个回答

6

使用awk:

awk '{w=$1} END{print w}' file

或者使用sed:

sed -n '$s/^\([^ ]*\).*$/\1/p' file

LOL sed 太复杂了,有没有维基百科之类的东西?(我不喜欢使用我不太了解/理解的东西) 感谢你告诉我的 awk 示例,我会使用这个: currentver=(awk 'END{print}' changelog.txt)因为我需要保持 $1 为空,然后 currentver[0] 就是我需要的;这是一个好方法吗? - Wyatt_LandWalker
是的,awk在这里要简单得多。 - anubhava
使用 sed 命令时,加上 -r 参数不是更好吗?这样就不需要转义括号了。 - jkshah
此外,awk会处理整个文件,如果change_log太长怎么办!这只是一个假设性的问题。我更喜欢用带有grepsedtail - jkshah
1
我认为您需要测量性能以确定整个文件是否被处理到达结尾。在某种意义上,所有面向行的程序都需要从文件开头读取到达结尾;如果您可以确定这样做不会错过程序所需的任何早期行,则可以使用二进制搜索与seek()相结合来稍后开始。 - chepner

3
如果你不喜欢awk或sed,你可以这样做:
tail -n1 file | cut -d' ' -f1

但实际上,awk和sed这两个工具更适合这项工作...

我想我会使用 awk 'END{print w}' changelog.txt | cut -d' ' -f1 - Wyatt_LandWalker
我唯一不使用awk或sed的情况是当我在嵌入式系统上,这些工具没有被安装。 - Jonathan Hall

2

bash:

read CURRENTVERSION rest < <(tail -1 changelog)

感谢,这也是一个有效的替代! - Wyatt_LandWalker

0
CURRENTVERSION=$( perl -anle 'print $F[0] if eof' changelog )
echo $CURRENTVERSION 
v-0.4

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接