如果使用 sed 匹配,如何删除行的第一个字符?

如果使用 sed 匹配,如何删除行的第一个字符?

我有一个文本文件,其中包含以下内容:

#[多库]

如果 #[multilib] 完全存在,我想从行中删除 #。

我试过:

sed -i 's/^#[multilib]/[multilib]/'

并且它不会从行中删除#。

答案1

[和字符]在正则表达式中是特殊的。为了匹配文字字符串,需要对它们进行转义:

sed -i 's/^#\[multilib\]/[multilib]/' file
# or
sed -i -E 's/^#(\[multilib\])/\1/' file

答案2

请注意,这是一个受's启发的-i非标准且不可移植的选项。这里也可以直接使用:sedperl-iperl

perl -pi -e '$_ = substr($_, 1) if rindex($0, "#[multilib]", 0)' file

或者使用正则表达式:

perl -pi -e 's/^#(?=\[multilib\])//' file

哪里(?=...)有一个积极的前瞻性#运算符,因此只要后面跟着 ,它就会删除前导[multilib]。在 perl 正则表达式中,就像在 sed 正则表达式中一样,[,]是运算符,您可以使用 进行转义,\也可以使用 进行转义\Q[multilib]\E

相关内容