2011-05-04 1046 views

回答

8

刚刚尝试一个sed什么都不做的:

sed '' file 

sed -n '' file 

首先将打印整个文件,但第二个将不打印什么。

+1

最快答案FTW! – 2011-05-04 16:37:02

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的发生(与两个事件和b)

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

明确打印模式空间。

14

Sed有两个地方可以存储文本:模式空间和存储空间。模式空间是每行被sed命令处理的地方;放置空间是放置稍后可能要使用的一些文本的辅助场所。你可能只会使用模式空间。

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

The quick brown fox jumps over the lazy dog. 

我们运行以下命令:

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

桑达将适用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 

结果是只有fox被替换

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

注意。发生这种情况是因为在打印模式空间之前没有执行第二个命令。如果我们希望这两个命令后打印模式空间,我们只要把p在第二个之后:

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

只是注意:您可以将p标志传递给s///命令太:

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

这是一个有点不寻常的AFAIK,但有优势,该行将被打印只有被标记的替换被执行。有时候这可能非常有用。

HTH

+1

+1获得非常详细的答案 – 2011-05-04 16:40:03