gpt4 book ai didi

sed - 了解 sed 保持空间工作流程

转载 作者:行者123 更新时间:2023-12-01 07:26:15 29 4
gpt4 key购买 nike

我想打印出包含一个或多个整数的文件的最后一行。下例中的“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
$

有人能解释一下 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

您保存该行以保留空间,然后将其交换回模式空间。模式空间和保持空间的内容可以这样表示:
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

您真正想要的是仅在到达输入文件的最后一行时交换内容。您可以通过对 xp 命令进行分组来做到这一点:
gsed -n -r '/[0-9]+/h; $ {x;p}' testfile

输出:
hippo 9991

对应的模式空间和保持空间序列现在是:
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

关于sed - 了解 sed 保持空间工作流程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23908561/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com