sed中的-n选项有什么作用?


13

这是以下产品的手册页条目-n

-n

禁止自动打印图案空间

我注意到,当使用-n对某些操作,每行被打印到标准输出(和所请求的线被印刷两次):

$ cat test.txt 
first
second
third
fourth
fifth

$ sed -n '2,3p' test.txt 
second
third

$ sed '2,3p' test.txt 
first
second
second
third
third
fourth
fifth

但是,该法律不适用于其他命令:

$ sed -n 's/t/T/' test.txt 

$ sed 's/t/T/' test.txt 
firsT
second
Third
fourTh
fifTh

那么究竟是-n什么呢?

Answers:


17

通常,sed处理每一行(进行替换等),然后打印结果。如果处理涉及要打印的行(例如sed的p命令),则它将被打印两次(一次在处理过程中,然后再次通过自动后处理打印)。该-n选项禁用了自动打印,这意味着您没有明确告知要打印的行不会被打印,而您明确告诉其要打印的行(例如,带有p)仅被打印一次。

  • sed -n '2,3p' test.txt -根据要求仅打印第2至3行

  • sed '2,3p' test.txt -自动打印每行,第二次也打印2-3行

  • sed -n 's/t/T/' test.txt -每行用“ T”替换“ t”,但由于以下原因,不打印结果 -n

  • sed 's/t/T/' test.txt -每行用“ T”替换“ t”,并自动打印结果

让我添加更多示例:

  • sed -n 's/t/T/p' test.txt -每行用“ T”替换“ t”,仅打印替换发生的行(即不是“ second”)

  • sed 's/t/T/p' test.txt -在每行上用“ T”替换“ t”,打印发生替换的行,然后自动打印每行(结果:“ second”打印一次,所有其他打印两次)

  • sed '2,3p; 3p' test.txt-打印第1、4和5行一次(自动打印);第2行两次(第一个p命令然后是自动打印),第3行三次(每次p命令一次,然后又自动)。


谢谢戈登,但您的评估只重复了我的观察。在前两个示例中,没有-n特别要求的sed会打印出每一行,除了特别要求的那些行。因此,在那种情况下,-n 抑制了所解析的每一行的打印。但是,在第三个和第四个示例中,行为是不同的。在那些情况下-n,不使用sed 不会输出两次行,因此使用-n不会抑制已解析的每行的打印,而是会抑制未更改的行的打印。我很难概括何时该行为将是另一种。
dotancohen 2014年

不,在两种情况下,它们-n所做的事情完全相同:从自动打印的每一行(以及pp修饰符切换到替换命令会导致该行被额外打印),切换为在明确告知行的情况下才打印行的模式到(使用p命令等)。
戈登·戴维森

换种说法:尝试在sed命令中添加该-n选项,同时还添加; p该内容(例如sed -n '2,3p; p',您将获得与没有任何结果时相同的结果。-n取消默认的自动打印,并; p添加一个显式(主要是等效的) )
戈登·戴维森

我现在知道了,谢谢。非常感谢您抽出宝贵时间来使示例更明确。祝你有个很棒的一周!
dotancohen 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.