首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用perl替换正则表达式

使用perl替换正则表达式
EN

Stack Overflow用户
提问于 2013-11-16 22:04:58
回答 2查看 146关注 0票数 0

我正在尝试用perl替换正则表达式。我在perl中使用过sed,但是它似乎不起作用。

要在文件trans.xml中替换的采样线

“公平”与“效率”

我需要将“效率”替换为“效率”

我尝试了下面的代码,

代码语言:javascript
复制
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内部执行。

任何帮助都将不胜感激!

EN

回答 2

Stack Overflow用户

发布于 2013-11-16 22:46:34

你是双引号的受害者。

say替换您的system调用将更清楚地告诉您发生了什么:

代码语言:javascript
复制
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的其他单引号功能要好得多:

代码语言:javascript
复制
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%明确的。

票数 1
EN

Stack Overflow用户

发布于 2013-11-17 07:03:23

几个严重的问题:

  1. 你为什么要打电话给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.xmlUTF-8编码的,那么您需要做的就是将slurp/spew替换为slurp_utf8/spew_utf8。VS sed,它可能不了解带有字符串的unicode.

  • system,应该尽可能避免,因为许多原因,其中一个是你经历过的问题:引用很难。

系统(‘sed’,'-e',$regexp )

在可能的情况下是首选的语法。注意,你不能将它与重定向结合使用,但你真的不需要这样做。

  • 对sed的多次调用是不需要的:

sed %s/foo/bar/g;s/bar/baz/g‘

这将适用于两个expressions.

  • Once #3的实现,不需要临时文件:

sed栏的/foo/ -i /g;s/bar/baz/g‘$file

这将使用system修改PLACE

  • When中的$file ,您可能需要检查返回值。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20019365

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档