我想打印出包含一个或多个整数的文件的最后一行.以下示例中的"Hippo 9991".我试图通过gsed -n -r '/[0-9]+/h;x;$p'命令实现这一点,但这不是很有效:
$ cat testfile
dog
lion 34
elephant
tiger 7
hippo 9991
zebra
gepard
cat
$ cat testfile | gsed -n -r '/[0-9]+/h;x;$p'
gepard
$
Run Code Online (Sandbox Code Playgroud)
有人可以解释到底是gsed -n -r '/[0-9]+/h;x;$p'做什么的吗?据我所知,它应该从行中删除尾随的换行符并将该行读入模式空间.然后,如果模式空间中的行包含一个或多个整数,则通过替换保留空间中的先前数据将该行放入保留空间.重复该循环直到将要打印的最后一行.显然我不明白这一点.不仅仅是一个正确的答案我想了解sed的工作流程.
你几乎拥有它.以下是您的脚本所做的事情:
/[0-9]+/h # if line contains a number, save the line to hold space
x # swap content of pattern space and hold space
$p # when on the last line print pattern space
Run Code Online (Sandbox Code Playgroud)
您保存线以保留空间,然后将其交换回图案空间.模式空间和保持空间的内容可以这样说明:
Line Command Pattern Space Hold Space
~~~~ ~~~~~~~~~~~ ~~~~~~~~~~~~~ ~~~~~~~~~~
1 /[0-9]+/h dog
1 x dog
2 /[0-9]+/h lion 34 lion 34
2 x lion 34 lion 34
3 /[0-9]+/h elephant lion 34
3 x lion 34 elephant
4 /[0-9]+/h tiger 7 tiger 7
4 x tiger 7 tiger 7
.
.
.
$ /[0-9]+/h cat geopard
$ x geopard cat
$ p geopard cat
Run Code Online (Sandbox Code Playgroud)
你真正想要的只是在达到输入文件的最后一行时才交换内容.您可以通过分组做到这一点x和p命令:
gsed -n -r '/[0-9]+/h; $ {x;p}' testfile
Run Code Online (Sandbox Code Playgroud)
输出:
hippo 9991
Run Code Online (Sandbox Code Playgroud)
相应的模式空间和保持空间序列现在是:
Line Command Pattern Space Hold Space
~~~~ ~~~~~~~~~~~ ~~~~~~~~~~~~~ ~~~~~~~~~~
1 /[0-9]+/h dog
2 /[0-9]+/h lion 34 lion 34
3 /[0-9]+/h elephant lion 34
4 /[0-9]+/h tiger 7 tiger 7
.
.
.
$ /[0-9]+/h cat hippo 9991
$ x hippo 9991 cat
$ p hippo 9991 cat
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
230 次 |
| 最近记录: |