我有以下测试文件
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: `/'
有什么想法可以实现这一目标吗?
我有以下测试文件
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:
假设您没有任何包含多个#
s的行,则可以这样做:
sed -e '/BBB/ s/^#*/#/' -i file
注意:您不需要/ g,因为每行最多只能进行一次替换。
sed '/^#BBB/'
你的意思是。但是,如果BBB位于中间位置,它将无法正常工作。有一个写选项可以sed '/^#/! {/BBB/ s/^/#/}'
更好地工作,但是只要您知道它的局限性,我的初始解决方案就会更简单。
sed -e '/BBB/ s|^(//)*|//|' -i file
。请注意,它仅适用于单一类的评论,假设评论开始在该行的开头,将取代多成对的的//
同一个单一的//
。
我发现此解决方案最有效。
sed -i '/^[^#]/ s/\(^.*BBB.*$\)/#\ \1/' file
不管有多少个“#”符号,它都不会添加另一个。如果您要搜索的模式不包含“#”,它将被添加到该行的开头,并且还将添加一个尾随空格。
如果您不想要尾随空格
sed -i '/^[^#]/ s/\(^.*BBB.*$\)/#\1/' file
我通常提供sed
与-i.bak
备份文件进行更改原始副本之前:
sed -i.bak '/BBB/ s/^#*/#/' file
这样,完成后,我既可以拥有file
和file.bak
,也可以file.bak
在有信心的情况下决定删除。
#
在此命令后以3 s开头,它将“清除”它以1开头#
。要缓解此问题(如果有问题),只需相应地更改匹配部分(例如sed -e '/^BBB/
...)