了解sed hold-space工作流程

Mar*_*tin 3 sed

我想打印出包含一个或多个整数的文件的最后一行.以下示例中的"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的工作流程.

Tho*_*hor 7

你几乎拥有它.以下是您的脚本所做的事情:

/[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)

你真正想要的只是在达到输入文件的最后一行时才交换内容.您可以通过分组做到这一点xp命令:

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)