‘sed’实用程序的奇怪行为

‘sed’实用程序的奇怪行为

我在用着sed在 Windows 上通过 GnuWin32 移植。我有一个文本文件输入.txt有此内容

ab

我尝试使用这些组合命令将a字符分隔到新行,然后删除包含该a字符的行,因为我认为这些命令一个接一个地运行。

sed "s/a/\na\n/ ; /a/d" "input.txt" > "output.txt"

然而,我得到的只是一片空白输出.txt文件。如果我将其拆分为两个不同的命令

sed "s/a/\na\n/" "input.txt" > "output1.txt"
sed "/a/d" "output1.txt" > "output2.txt"

然后一切正常,输出2.txt文件只有一行字符b。那么我做错了什么?

答案1

该命令/a/d不会删除行;它会删除模式空间。虽然模式空间最初只包含一行,但您的第一个替换命令会将模式空间变成两行。要删除以 结尾的行a,请尝试:

$ sed "s/a/a\n/ ; s/[^\n]*a\n//" "input.txt"
b

正则表达式[^\n]*a\n匹配以 结尾的行中的所有内容a。 它被替换为空。

或者,如果您想从模式空间中删除完全由以下内容组成的行a

$ sed "s/a/\na\n/ ; s/\na\n//" "input.txt"
b

文档

sed 文档很清楚:d命令删除模式空间。

来自GNU sed 手册

d
删除模式空间;立即开始下一个循环。

来自POSIX awk 规范

[2addr]d
删除模式空间并开始下一个循环。

通常,sed 模式空间由一行组成,在这种情况下,行和模式空间之间的区别并不重要。但是,有很多方法(例如)s/a/a\n/可以将多行放入模式空间中。在这种情况下,区别很重要。

相关内容