我正在看书sed & awk
,我认为我理解了直到我执行以下n
命令sed
:
$ echo -ne "abc\ncde\nfg\n" | sed "/c/{
n
/f/d
}"
Run Code Online (Sandbox Code Playgroud)
输出:
abc
cde
fg
Run Code Online (Sandbox Code Playgroud)
但我希望该行fg
被删除。
我对流程的理解:
c
匹配行cde
,下一行是fg
并且应该被/f/d
命令删除,因为它被匹配f
。我非常确定我理解这个命令并且它很简单。特别是因为作者写道大写命令N,D,P
命令更难,如果你理解它们,那么无论如何你都会理解小写命令。但我对N
命令完全没有困难。
问题是,您的行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
}"
Run Code Online (Sandbox Code Playgroud)
输出:
abc$
fg$
Run Code Online (Sandbox Code Playgroud)
l
在脚本开头添加ook 命令会告诉您哪些输入行是在代码块之外处理的。