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

标签 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 保留 $@作为变量前缀。

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

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

最佳答案

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/

相关文章:

c++ - 将字符串拆分为连续的非空白字符序列

javascript - 如何使用正则表达式将文本设置为小写?

perl - 为什么 Perl 中的这个 map 语句不能编译?

perl - 如何按节点类型获取 XML::LibXML 中的子节点?

regex - Linux bash : sed, awk 等工具将行尾正则表达式 '$' 匹配为终端宽度

c - 如何在程序输出本身中查看当前进程状态

regex - 交替与 sed 中的预期不匹配

javascript - 正则表达式从电话号码中提取两位数字

algorithm - 解析 csv 文件并跳过前 3000 行

bash - 如何使用 sed 或 grep 替换整个字符串