如何使用Shell或Perl替换字符串,即使它包含正则表达式元字符?

时间:2014-10-10 02:43:33

标签: regex perl sed

我想将一个可能包含正则表达式元字符的单词替换为另一个单词,例如,将.Precilla123替换为.Precill,我尝试使用下面的解决方案:

sed 's/.Precilla123/.Precill/g'

但它会在行下面改变

"Precilla123";"aaaa aaa";"bbb bbb"

.Precill";"aaaa aaa";"bbb bbb"

这种副作用不是我想要的。所以我尝试使用:

perl -pe 's/\Q.Precilla123\E/.Precill/g'

上述解决方案可以禁用解释的正则表达式元字符,它不会产生副作用 不幸的是,如果单词包含$@,则此解决方案仍无效,因为Perl会将$@保留为变量前缀。

有人可以帮忙吗?非常感谢。

请注意,我想替换的单词不是硬编码的,它来自输入文件,您可以将其视为变量。

2 个答案:

答案 0 :(得分:3)

  

很遗憾,如果该字词包含$@,则此解决方案仍然无效,因为Perl会将$@保留为变量前缀。

事实并非如此。

如果要替换的值在Perl变量中,则quotemeta将对变量的内容起作用,包括字符$@

echo 'pre$foo to .$foobar' | perl -pe 'my $from = q{.$foo}; s/\Q$from\E/.to/g'

输出:

pre$foo to .tobar

如果您要替换的单词位于外部文件中,则只需在编写正则表达式进行替换之前将该数据加载到BEGIN块中。

答案 1 :(得分:0)

sed 's/\.Precilla123/.Precill/g'

使用\转义元字符。

对于主要是正则表达式[]{}()\.*+^$的搜索模式而言,mleta charactere不同,其中替换仅限于&\^$(+ {{1}之后依赖于您的第一个字符的分隔符在两种模式中)