我有以下测试文件
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: `/'
我是如何实现这一目标的?
答案 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
。