【发布时间】:2012-04-05 04:04:48
【问题描述】:
我有(来自 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)
【问题讨论】:
标签: regex sed pattern-matching