sed – 注释符合特定string且尚未注释掉的行

我有以下testing文件

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

任何想法我可以如何实现这一目标?

假设你没有多个#的行,这将工作:

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

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

我觉得这个解决方案是最好的。

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

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

如果你不想要尾随空间

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

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

这不适用于我的关键字*.sudo ,根本没有评论…

Ony下面的语法工作: sed -e '/sudo/ s/^#*/#/' file