我(从sed网站http://sed.sourceforge.net/sed1line.txt)获得了这条消息:
sed -e '/./{H;$!d;}' -e 'x;/AAA/!d;/BBB/!d;/CCC/!d'
它的目的是搜索一个段落的AAA,BBB或CCC。
我对剧本的理解:
/./‘匹配每一行不是空的holdspace
H 111/code>‘x’交换模式,并由
搜索H 214F 215
我不清楚的是:
在保留空间应该是几行单独的(对于每一段),为什么我能够搜索整个段落呢?保留空间中的行是否合并成一行?
和sed如何知道一个段落何时结束,另一个段落以“$!d”开头,为什么'$d‘还不够?为什么我不能省略'-n‘,使用'$p’而不是'$!d‘在这个例子中?
非常感谢您的每一个评论!
我的测试数据(将每一段与其中的XX匹配):
YYaaaa
aaa1
aaa2
aXX3
aaa4
YYbbbb
bbb1
bbb2
YYcccc
ccc1
ccc2
ccc3
cXX4
ccc5
YYdddd
ddd1
dXX2
使用以下命令:
sed -ne '/./{H;$!d};x;/XX/p' test2
版本:
$ sed --version
GNU sed-Version 4.2.1
$ bash --version
GNU bash, Version 4.2.10(1)-release (x86_64-pc-linux-gnu)
发布于 2012-04-04 11:45:15
它将一个段落作为单独的行收集到“保持空间”(H
)中,然后当您单击一个空行时,/./
会失败,并且它会掉到x
,该x
基本上会为下一段划出保持空间。
为了正确处理最后一段,它需要处理一个没有空行的段落,因此它从最后一行掉下来,就好像后面跟着空行一样。这是一个常见的习惯用法,用于通过特定模式收集某些内容的脚本(或者,换句话说,此类脚本在文件结束时无法处理最后收集的数据是常见的错误)。
换句话说,如果我们正在查看一个非空行,将其添加到looking空间,除非它是文件中的最后一行,否则删除它,然后从脚本的开头开始,使用下一个输入行。(也许你对d
的理解还不够完整?)这就是$!d
的意思。)
否则,我们有一个空的行,或者文件的末尾,并且保持空间包含零行或多行文本(一段,可能是空的)。将它们转换到模式空间(当前、空、行方便地移动到保持空间)并检查模式空间。如果它与我们的一个表达式不匹配,请删除它。否则,默认操作是打印整个模式空间。
https://stackoverflow.com/questions/10018098
复制