不明白 sed 的“n”命令

ka3*_*3ak 3 sed

我正在看书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命令完全没有困难。

cuo*_*glm 6

问题是,您的行fg永远不会与模式匹配/f/

第一行abc匹配/c/,然后执行块内的命令。

  • n命令打印当前模式空间,abc并将模式空间替换为下一行输入,即cde.

  • cde不匹配/f/,则它没有被d选中,并打印为标准输出。

现在,下一行输入fg被读取,不匹配/c/,那么代码块没有被执行。

您可以使用look 命令进行验证:

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 命令会告诉您哪些输入行是在代码块之外处理的。