我需要频繁注释/取消注释包含带“#”的字符串的行。例如:
Don't touch this line.
Touch this LINE instead.
<==>
Don't touch this line.
#Touch this LINE instead.
我能够使用 sed 进行注释,但无法取消注释。我尝试使用命令
sed 's/^#\(.*\)LINE/\1/' hosts
它确实在开头放置了一个“#”,但也删除了 LINE 和以下字符,这使得它:
Don't touch this line.
#Touch this
正确的做法是什么?
答案1
正确的方法是s
只对符合特定模式的行进行操作,这样替换就会非常简单。
这将删除#
包含以下内容的行的前导LINE
:
sed '/LINE/ s/^#//'
这将删除所有前导#
字符:
sed '/LINE/ s/^#*//'
这将添加一个#
字符:
sed '/LINE/ s/^/#/'
显然,您无法删除#
不存在的行,但您可以#
在行首#
已经存在时添加行首。对上述命令的改进不会修改已注释的行:
sed '/^\([^#].*\|\)LINE/ s/^/#/'
它检测^LINE
或匹配行首的^[^#].*LINE
位置并匹配非。可以进一步改进该命令,因此行首的前导空格将不再被注释掉;我不会在这里这样做。^
[^#]
#
#
无论如何,使用/regex/ s…
。如果你的正则表达式恰好包含斜杠,请使用\
; 对其进行转义,或者选择另一个字符来包含正则表达式,但随后你需要对开头的字符进行转义(例如\@regex@ s…
)。