我正在尝试用perl替换正则表达式。我在perl中使用过sed,但是它似乎不起作用。
要在文件trans.xml中替换的采样线
“公平”与“效率”
我需要将“效率”替换为“效率”
我尝试了下面的代码,
system "sed -e 's/\&\#x0027\;\([a-zA-Z0-9 _]*\)\&\#x2019\;/tooch&/g' trans.xml > tmp.xml";
system "sed -e 's/tooch\&\#x0027\;/\&\#x2018\;/g' tmp.xml > trans.xml"上面的sed命令手动执行,但不是从Perl内部执行。
任何帮助都将不胜感激!
发布于 2013-11-16 22:46:34
你是双引号的受害者。
用say替换您的system调用将更清楚地告诉您发生了什么:
sed -e 's/'([a-zA-Z0-9 _]*)’/tooch&/g' trans.xml > tmp.xml
sed -e 's/tooch'/‘/g' tmp.xml > trans.xml看看出什么问题了?没有剩余的反斜杠。它们由Perl双引号解释,sed不能使用它们。
您的情况有点难以纠正,因为您已经使用(并且需要)单引号来传递给sed。从理论上讲,您可以再次避开所需的内容,但这很容易出错。使用Perl的其他单引号功能要好得多:
system q+sed -e 's/\&\#x0027\;\([a-zA-Z0-9 _]*\)\&\#x2019\;/tooch&/g' trans.xml > tmp.xml+;
system q(sed -e 's/tooch\&\#x0027\;/\&\#x2018\;/g' tmp.xml > trans.xml);我在第一行使用+作为分隔符,因为它恰好不在字符串本身中使用。我在第二行使用了简单的括号,因为它们在那里是100%明确的。
发布于 2013-11-17 07:03:23
几个严重的问题:
sed?当然,也许IO在perl中比较难做,但是perl内置了regexp。使用Path::Tiny qw(path);my $content = path('trans.xml')->slurp;$content =~ s/bar/baz/g;$content =~ s/foo/bar/g;path('trans.xml')->spew( $content );
注意:如果trans.xml是UTF-8编码的,那么您需要做的就是将slurp/spew替换为slurp_utf8/spew_utf8。VS sed,它可能不了解带有字符串的unicode.
system,应该尽可能避免,因为许多原因,其中一个是你经历过的问题:引用很难。系统(‘sed’,'-e',$regexp )
在可能的情况下是首选的语法。注意,你不能将它与重定向结合使用,但你真的不需要这样做。
sed %s/foo/bar/g;s/bar/baz/g‘
这将适用于两个expressions.
sed栏的/foo/ -i /g;s/bar/baz/g‘$file
这将使用system修改PLACE
$file ,您可能需要检查返回值。https://stackoverflow.com/questions/20019365
复制相似问题