sed中“-n”的含义究竟是什么?

时间:2011-05-04 16:17:50

标签: regex unix sed space

根据http://linux.about.com/od/commands/l/blcmdl1_sed.htm

  

禁止自动打印图案   空间

我测试了是否有-n,sed会产生相同的结果

我不明白这意味着什么空间。

4 个答案:

答案 0 :(得分:22)

Sed有两个存储文本的地方:模式空间和保留空间。模式空间是每个行由sed命令处理的地方;保持空间是一个辅助的地方,可以放置一些您可能想要稍后使用的文本。您可能只会使用模式空间。

在sed去处理一行之前,它被放入模式空间。然后,sed将所有命令(例如s///)应用于de pattern space,默认情况下,从模式空间打印结果文本。我们假设我们有一个文件myfile,其中包含以下行:

The quick brown fox jumps over the lazy dog.

我们运行以下命令:

sed 's/fox/coati/;s/dog/dingo/' myfile

对于文件的每一行,Sed将应用s/fox/coati/然后s/dog/dingo/ - 在这种情况下,我们上面展示的唯一一行。当它发生时,它会将该行放在模式空间中,该空间将具有以下内容:

The quick brown fox jumps over the lazy dog.

然后,sed将运行第一个命令。在sed运行命令s/fox/coati/之后,模式空间的内容将是:

The quick brown coati jumps over the lazy dog.

然后sed将应用第二个命令,即s/dog/dingo/。之后,模式空间的内容将是:

The quick brown coati jumps over the lazy dingo.

请注意,这只发生在内存中 - 现在没有打印出来。

将所有命令应用于当前行,默认后,sed将获取模式空间的内容并将其打印到标准输出。但是,当您将-n作为sed的选项时,您要求sed不执行最后一步,除非明确要求。所以,如果你运行

sed -n 's/fox/coati/;s/dog/dingo/' myfile

什么都不打印。

但你怎么能明确要求sed打印模式空间?好吧,你可以使用p命令。当sed找到此命令时,它将立即打印模式空间的内容。例如,在下面的命令中,我们请求sed在第一个命令之后打印模式空间的内容:

sed -n 's/fox/coat/;p;s/dog/dingo/' myfile

结果将是

$ sed -n 's/fox/coati/;p;s/dog/dingo/' myfile 
The quick brown coati jumps over the lazy dog.

请注意,只会替换fox。发生这种情况是因为在打印模式空间之前未执行第二个命令。如果我们想在两个命令之后打印模式空间,我们只需将p放在第二个命令之后:

sed -n 's/fox/coati/;s/dog/dingo/;p' myfile

如果您使用s///命令,另一个选项是将p标记传递给s///

sed -n 's/fox/coati/;s/dog/dingo/p' myfile 

在这种情况下,只有在执行了标记的替换时才会打印该行。它可能非常有用!

答案 1 :(得分:8)

试试sed do-nothing:

sed '' file

sed -n '' file

首先打印整个文件,但第二个不会打印任何内容。

答案 2 :(得分:3)

这会将sed置于安静模式,其中sed将禁止所有输出,除非p命令明确声明:

   -n 
   --quiet 
   --silent
          By default, sed will print out the pattern space at
          the  end  of  each cycle through the script.  These
          options disable this automatic  printing,  and  sed
          will  only  produce  output when explicitly told to
          via the p command.

如果您想使用sed来模拟grep:

的操作,那么这样做就是一个例子
$echo -e "a\nb\nc" | sed -n '/[ab]/ p'
a
b

没有-n你会得到一个c(和两次出现的a和b)

答案 3 :(得分:1)

$ echo "a b c d" | sed "s/a/apple/"
apple b c d

隐式打印图案空间。

$ echo "a b c d" | sed -n "s/a/apple/"

没有输出。

$ echo "a b c d" | sed -n "s/a/apple/p"
apple b c d

明确打印图案空间。