我在搜索具有多个特殊字符的文件中的字符串时遇到困难,并用一些具有特殊字符的文本替换整行。
在文件中搜索字符串
a.bb.cc[hk].ccm[*].nib[*].gion[*].der[*].sam[*].ant[ck].sant[*].tags[*].rmp
替换为
dde.be.cc[hk].com[*].nib[*].gion[*].der[*].sam[*].ant[ck].sant[*].tags[*].rmp=200
尝试使用linux sed,但需要逃避所有这些特殊字符,我不想这样做。其他字符串可能会更改这些特殊字符。
perl -e "s/$to_replace/$replace_with/g" -pi /tmp/l1
sed -i -e "s/'$to_replace'/'$replace_with'/g" /tmp/l1
这两个因为期望转义字符而失败。
这里的任何帮助将不胜感激。感谢
答案 0 :(得分:0)
使用\Q
和\E
转义序列来禁用模式元字符,即将它们视为常规字符匹配。同样地,您可以将搜索字符串放在quotemeta
函数中,然后执行s|$search|$replace|g
,现在可以按预期工作。
#!/usr/bin/env perl
use warnings;
use strict;
my $search = 'a.bb.cc[hk].ccm[*].nib[*].gion[*].der[*].sam[*].ant[ck].sant[*].tags[*].rmp';
my $replace = 'dde.be.cc[hk].com[*].nib[*].gion[*].der[*].sam[*].ant[ck].sant[*].tags[*].rmp=200';
my $txt = <<EOTXT;
This is some text.
The next line needs replacing...
Inside here: < a.bb.cc[hk].ccm[*].nib[*].gion[*].der[*].sam[*].ant[ck].sant[*].tags[*].rmp >
More normal text
EOTXT
# perldoc perlre
# s|...|...| substitute
# \Q ... \E quote (disable) pattern metacharacters till \E
#
# modifiers:
# s treat string as single line
# g global
$txt =~ s|\Q$search\E|$replace|sg;
print $txt;
<强>输出强>
This is some text.
The next line needs replacing...
Inside here: < dde.be.cc[hk].com[*].nib[*].gion[*].der[*].sam[*].ant[ck].sant[*].tags[*].rmp=200 >
More normal text