如何从 Linux 命令行删除包含特定字符串的行中的第一个字符?

如何从 Linux 命令行删除包含特定字符串的行中的第一个字符?

我需要频繁注释/取消注释包含带“#”的字符串的行。例如:

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…)。

相关内容