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,因为您每行最多进行一次替换.
小智 10
另一种带有&特殊字符的解决方案,它引用模式空间的整个匹配部分。它比捕获和引用正则表达式组更简单/更清晰。
sed -i 's/^[^#]*BBB/#&/' file
Run Code Online (Sandbox Code Playgroud)
我觉得这个解决方案工作得最好.
sed -i '/![^#]/ s/\(^.*BBB.*$\)/#\ \1/' file
Run Code Online (Sandbox Code Playgroud)
无论有多少"#"符号都没关系,它永远不会添加另一个符号.如果您要搜索的模式不包含"#",则会将其添加到行的开头,并且还会添加尾随空格.
如果您不想要尾随空格
sed -i '/![^#]/ s/\(^.*BBB.*$\)/#\1/' file
Run Code Online (Sandbox Code Playgroud)
假设 BBB 位于一行的开头,我最终使用了一个更简单的表达式:
sed -e '/^BBB/s/^/#/' -i file
Run Code Online (Sandbox Code Playgroud)
给未来的我再写一张纸条。不要忽视-i. 因为这行不通:sed -e "..." same_file > same_file.