我在用着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/
可以将多行放入模式空间中。在这种情况下,区别很重要。