sed - 注释匹配特定字符串的行和尚未注释掉的行

时间:2013-08-01 15:49:36

标签: regex linux unix sed

我有以下测试文件

AAA
BBB
CCC

使用以下sed我可以注释掉 BBB 行。

# sed -e '/BBB/s/^/#/g' -i file

如果它在开头没有#,我只想评论该行。

# sed -e '/^#/! /BBB/s/^/#/g' file

sed: -e expression #1, char 7: unknown command: `/'

我是如何实现这一目标的?

8 个答案:

答案 0 :(得分:72)

假设您没有任何包含多个#的行,这将起作用:

sed -e '/BBB/ s/^#*/#/' -i file

注意:你不需要/ g,因为你每行最多进行一次替换。

答案 1 :(得分:8)

我发现这个解决方案能够发挥最佳效果。

sed -i '/![^#]/ s/\(^.*BBB.*$\)/#\ \1/' file

有多少“#”符号并不重要,它永远不会添加另一个符号。如果您要搜索的模式不包含“#”,则会将其添加到行的开头,并且还会添加尾随空格。

如果您不想要尾随空格

sed -i '/![^#]/ s/\(^.*BBB.*$\)/#\1/' file

答案 2 :(得分:2)

另一个带有throttle_first特殊字符的解决方案,它引用模式空间的整个匹配部分。比捕获和引用一个正则表达式组要简单/干净一些。

&

答案 3 :(得分:1)

n_max_adulti

这对我来说不适用于关键字sed -i '/![^#]/ s/\(^.*BBB.*$\)/#\ \1/' file,根本没有评论......

Ony下面的语法有效: *.sudo

答案 4 :(得分:1)

假设BBB在一行的开头,我最终使用了一个更简单的表达式:

sed -e '/^BBB/s/^/#/' -i file

再给我一个未来的音符。不要忽略-i。因为这不起作用:sed -e "..." same_file > same_file

答案 5 :(得分:1)

评论所有“BBB”,如果还没有评论。

sed -i '/BBB/s/^#\?/#/' file

答案 6 :(得分:0)

实际上,你不需要惊叹号(!),因为插入符号已经否定了方括号内的任何内容,并且会忽略搜索中的所有哈希符号。这个例子对我有用:

sed -i '/[^#]/ s/\(^.*BBB.*$\)/#\ \1/' file

答案 7 :(得分:0)

在更改原始副本之前,我通常会向sed提供-i.bak来备份文件:

sed -i.bak '/BBB/ s/^#*/#/' file

这样一来,我既有file也有file.bak,只有在我有信心的情况下,才能决定删除file.bak