我想将一个可能包含正则表达式元字符的单词替换为另一个单词,例如,将.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会将$
和@
保留为变量前缀。
有人可以帮忙吗?非常感谢。
请注意,我想替换的单词不是硬编码的,它来自输入文件,您可以将其视为变量。
答案 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}之后依赖于您的第一个字符的分隔符在两种模式中)