我正在看书sed & awk
,我认为我理解了n
命令,sed
直到执行以下命令:
$ echo -ne "abc\ncde\nfg\n" | sed "/c/{
n
/f/d
}"
输出:
abc
cde
fg
但我预计该行fg
会被删除。
我对流程的理解:
c
匹配该行cde
,下一行fg
应该被命令删除,/f/d
因为它与 匹配f
。
我确信我理解这个命令并且它很简单。特别是因为作者写道,大写命令N,D,P
更困难,如果您理解它们,那么您无论如何都会理解小写命令。但我对命令没有N
任何困难。
答案1
问题是,你的行fg
永远不会与模式匹配/f/
。
第一行abc
匹配/c/
,则执行块内的命令。
该
n
命令打印当前模式空间,即 ,abc
并用下一行输入替换该模式空间,即cde
。cde
不匹配/f/
,则它不会被d
删除,并打印到标准输出。
现在,读取下一行输入fg
,不匹配/c/
,则不执行代码块。
您可以使用l
ook 命令进行验证:
echo -ne "abc\ncde\nfg\n" | sed -n "l;/c/{
n
/f/d
}"
输出:
abc$
fg$
l
在脚本开头添加ook 命令会告诉您哪些输入行是在代码块之外处理的。
答案2
阅读 @don_crissti 的评论后,我想我明白n
命令如何影响sed
.
n
..."/c/{...
从下一个周期的分析中排除读取(或下一个)行。因此,如果n
在我的示例中使用2次,abc
将匹配然后cde
将被读取,然后fg
将被读取并删除。
$ echo -ne "abc\ncde\nfg\n" | sed "/c/{
n
n
/f/d
}"
输出:
abc
cde