不明白 sed 的 'n' 命令

不明白 sed 的 'n' 命令

我正在看书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/,则不执行代码块。

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

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

相关内容