只有在使用“p”时,“sed -n”才会显示输出吗?

只有在使用“p”时,“sed -n”才会显示输出吗?
  • sed -n表示只显示命令处理后的结果,所以我需要添加'p'来显示结果
  • 否则sed -n不会显示结果

这对不对?

sed [root@ljl ~]# cat a.txt 
1111simon111
simon2222222
333simon3333
444444444444
5555555simon
simon6666666
7777777simon
888888888888
[root@ljl ~]# sed -n 's/simon/lili/gp' a.txt
1111lili111
lili2222222
333lili3333
5555555lili
lili6666666
7777777lili
[root@ljl ~]# sed -n 's/simon/lili/g' a.txt
[root@ljl ~]# 

答案1

在每个“循环”结束时,即sed在编辑脚本中完成运行最终命令时,有一个隐式n命令将打印模式空间的当前内容并将其替换为当前输入的下一行输入文件。那么脚本周期回到顶部。

如果您从其选项开始,则该命令(以及脚本中的n任何其他命令)的输出将被抑制。nsed-n

使用-n并不意味着全部的输出sed将被抑制。例如,r从文件读取文本并将其发送到标准输出的命令仍将在标准输出上生成输出,=输出当前行号的命令也是如此。同样,用于添加、插入和更改文本的命令、 和,以及用于以各种特定方式输出文本的a命令、 和,无论如何都会生成输出(有关这些命令的具体功能,请参阅手册)。错误等自然也会在标准错误上输出,就像没有.iclP-nsed-n

此外,该p命令显然仍会产生输出,就像s///与其p标志(s///p)一起使用的命令一样,这就是您在问题中提到的。

当该命令丢弃模式空间并立即开始下一个循环时,它总是会跳过脚本末尾的d隐式,就像不太常用的命令一样。nD

-n可以sed通过#n在脚本开始处使用来在脚本中调用该选项。

示例:sed仅打印包含子字符串 的行的脚本HELLO,无论是否-n在命令行上使用。

#n
/HELLO/p

必须位于第一行,在此脚本中,除了脚本中#n显式命令打印的内容之外,它将抑制每一行的打印。p

答案2

是的,如果您使用的是 ,则需要使用p来打印匹配/修改的行-n

来自man sed(GNU 版本):

-n,--安静,--沉默

抑制图案空间的自动打印

答案3

sed -n并不意味着“仅显示命令处理后的结果”。它的意思是“仅在明确要求时打印”,即“不自动打印”。

通常,您使用p命令来显式、无条件地打印。在你的情况下,它将是:

sed -n 's/simon/lili/g;p' a.txt

上面不是您使用的语法。这是你使用的:

sed -n 's/simon/lili/gp' a.txt

p是一个修饰符(就像g是一个修饰符)s,意思是“如果进行替换,然后打印新的模式空间”。与该p命令一样,它是一个显式的打印请求(因此它对 有用-n),但它是有条件的。

相关内容