【发布时间】:2011-05-04 16:17:50
【问题描述】:
根据http://linux.about.com/od/commands/l/blcmdl1_sed.htm
禁止自动打印图案 空间
我在有或没有-n 的情况下进行了测试,sed 会产生相同的结果
我不明白空格是什么意思。
【问题讨论】:
根据http://linux.about.com/od/commands/l/blcmdl1_sed.htm
禁止自动打印图案 空间
我在有或没有-n 的情况下进行了测试,sed 会产生相同的结果
我不明白空格是什么意思。
【问题讨论】:
Sed 有两个地方可以存储文本:模式空间和保持空间。模式空间是每行被 sed 命令处理的地方;保留空间是放置一些您以后可能要使用的文本的辅助位置。您可能只会使用模式空间。
在 sed 处理一行之前,它被放入模式空间。然后,sed 将所有命令(例如 s///)应用到 de 模式空间,并且默认情况下,从模式空间打印结果文本。假设我们有一个文件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
在这种情况下,只有在标记的替换被执行时才会打印该行。它可能非常有用!
【讨论】:
sed -n 's/fox/coati/;s/dog/dingo/;p' myfile 和 sed -n 's/fox/coati/;s/dog/dingo/p' myfile 有所作为。
dog 被dingo 替换时,该行才会被打印。例如,如果fox 被coati, 替换,则不会打印该行。
试试 sed 什么都不做:
sed '' file
和
sed -n '' file
第一个将打印整个文件,但第二个不会打印任何内容。
【讨论】:
-n 和 -i。我得到一个空文件,但不明白为什么。我刚停下来,因为我看到了你的评论,谢谢!
这会将 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 的出现)
【讨论】:
$ echo "a b c d" | sed "s/a/苹果/" 苹果b c d
隐式打印模式空间。
$ echo "a b c d" | sed -n "s/a/apple/"
没有输出。
$ echo "a b c d" | sed -n "s/a/苹果/p" 苹果b c d
显式打印模式空间。
【讨论】: