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


73

我有以下测试文件

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: `/'

有什么想法可以实现这一目标吗?

Answers:


97

假设您没有任何包含多个#s的行,则可以这样做:

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

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


2
这将始终编辑匹配的行以单个#开头。因此,如果#在此命令后以3 s开头,它将“清除”它以1开头#。要缓解此问题(如果有问题),只需相应地更改匹配部分(例如sed -e '/^BBB/...)
Steven Lu

3
sed '/^#BBB/'你的意思是。但是,如果BBB位于中间位置,它将无法正常工作。有一个写选项可以sed '/^#/! {/BBB/ s/^/#/}'更好地工作,但是只要您知道它的局限性,我的初始解决方案就会更简单。
aragaer 2014年

如果我们在Java程序中使用上面的方法,该如何转义?
克里希纳·潘迪

像这样:sed -e '/BBB/ s|^(//)*|//|' -i file。请注意,它仅适用于单一类的评论,假设评论开始在该行的开头,将取代多成对的//同一个单一的//
aragaer

是否可以将BBB放入输入变量中?
Fuseteam

9

我发现此解决方案最有效。

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

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

如果您不想要尾随空格

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

这对于模式匹配非常有用。谢谢
Chaminda Bandara '18

1
您可能要替换“!” 以“^”但除此之外,这比官方的回答更好的解决方案
oᴉɹǝɥɔ

8

具有&特殊字符的另一种解决方案引用了模式空间的整个匹配部分。它比捕获和引用一个regexp组更简单/更干净。

sed -i 's/^[^#]*BBB/#&/' file

1

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

这对我来说对关键字不起作用*.sudo,根本没有评论...

仅以下语法有效: sed -e '/sudo/ s/^#*/#/' file


1

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

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

再给我一个未来的音符。不要忽视了-i。因为这行不通:sed -e "..." same_file > same_file


0

实际上,您不需要感叹号(!),因为插入号符号已经使方括号内的内容无效,并且将忽略搜索中的所有哈希符号。这个例子对我有用:

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


0

我通常提供sed-i.bak备份文件进行更改原始副本之前:

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

这样,完成后,我既可以拥有filefile.bak,也可以file.bak在有信心的情况下决定删除。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.