sed - 查找带有特殊字符的字符串并替换为文件

时间:2018-03-12 14:12:42

标签: python perl sed replace find

我在搜索具有多个特殊字符的文件中的字符串时遇到困难,并用一些具有特殊字符的文本替换整行。

在文件中搜索字符串

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

这两个因为期望转义字符而失败。

这里的任何帮助将不胜感激。感谢

1 个答案:

答案 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