根据http://linux.about.com/od/commands/l/blcmdl1_sed.htm
禁止自动打印图案 空间
我测试了是否有-n
,sed会产生相同的结果
我不明白这意味着什么空间。
答案 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
明确打印图案空间。