我想将可能包含正则表达式元字符的单词替换为另一个单词,例如将 .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 保留 $
和 @
作为变量前缀。
有人可以帮忙吗?非常感谢。
请注意,我要替换的单词不是硬编码的,它来自输入文件,您可以将其视为变量。
最佳答案
Unfortunately, if the word contains
$
or@
, this solution still cannot work, because Perl keep$
and@
as variable prefix.
这不是真的。
如果要替换的值位于 Perl 变量中,则 quotemeta
将很好地处理变量的内容,包括字符 $
和 @
:
echo 'pre$foo to .$foobar' | perl -pe 'my $from = q{.$foo}; s/\Q$from\E/.to/g'
输出:
pre$foo to .tobar
如果您要替换的单词位于外部文件中,则只需在编写用于替换的正则表达式之前将该数据加载到 BEGIN block 中即可。
关于regex - 如何使用 Shell 或 Perl 替换字符串,即使它包含正则表达式元字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26291141/