我有(来自 sed 网站http://sed.sourceforge.net/sed1line.txt)这个单行:
sed -e '/./{H;$!d;}' -e 'x;/AAA/!d;/BBB/!d;/CCC/!d'
其目的是在段落中搜索 AAA、BBB 或 CCC。
我对剧本的理解:
- '/./' 匹配不为空的每一行
- '{}' 括号内的所有命令都处理匹配的行
- 'H' 用匹配的行附加保持空间
- '$!d' 从模式空间中删除除最后一行之外的所有内容
- 'x' 交换模式和保持空间
- '/AAA/!d' 搜索 AAA 段落并打印
我不清楚的是:
- 在holdspace中应该有几个单独的行(对于每个段落),为什么我能够搜索整个段落?保持空间中的行是否合并为一行?
- 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)