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

Jea*_*tte 57 regex unix linux sed

我有以下测试文件

AAA
BBB
CCC
Run Code Online (Sandbox Code Playgroud)

使用以下sed我可以注释掉BBB线.

# sed -e '/BBB/s/^/#/g' -i file
Run Code Online (Sandbox Code Playgroud)

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

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

sed: -e expression #1, char 7: unknown command: `/'
Run Code Online (Sandbox Code Playgroud)

我有什么想法可以达到这个目的吗?

ara*_*aer 78

假设你没有任何多行的行,#这将有效:

sed -e '/BBB/ s/^#*/#/' -i file
Run Code Online (Sandbox Code Playgroud)

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

  • `sed '/^#BBB/'` 你的意思是。但是如果 BBB 在中间的某个地方,它就行不通了。有一个选项可以写`sed '/^#/! {/BBB/ s/^/#/}'` 效果会更好,但只要您知道它的局限性,我的初始解决方案就会简单得多。 (3认同)
  • 这将始终编辑匹配行以从单个#开始.所以如果它在这个命令之后以三个`#`开头,那么它将"清理"它只是以一个`#`开头.如果这是一个问题,要解决这个问题,只需相应地更改匹配部分(例如`sed -e'/ ^ BBB /`...) (2认同)

小智 10

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

sed -i 's/^[^#]*BBB/#&/' file
Run Code Online (Sandbox Code Playgroud)


Bob*_*rny 8

我觉得这个解决方案工作得最好.

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

无论有多少"#"符号都没关系,它永远不会添加另一个符号.如果您要搜索的模式不包含"#",则会将其添加到行的开头,并且还会添加尾随空格.

如果您不想要尾随空格

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

  • 您可能想要替换“!” 与“^”,但除此之外,这是比官方答案更好的解决方案 (2认同)

Ray*_*Luo 6

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

sed -e '/^BBB/s/^/#/' -i file
Run Code Online (Sandbox Code Playgroud)

给未来的我再写一张纸条。不要忽视-i. 因为这行不通:sed -e "..." same_file > same_file.