繁体   English   中英

仅在Perl中的正则表达式匹配中替换字符串

[英]Replace strings only within a regex match in perl

我有一个XML文档,其属性值中包含文本。 我无法更改XML文件的生成方式,但是需要提取属性值而不丢失\\ r \\ n。 XML解析器当然会将它们剥离。

所以我试图用实体引用替换属性值中的\\ r \\ n,因为它是非贪婪的匹配,所以我使用perl来做到这一点。 但是我需要帮助才能让替换只在比赛中进行。 或者我需要一个更简单的方法来做到这一点:)

这是我到目前为止的内容:

perl -i -pe 'BEGIN{undef $/;} s/m_description="(.*?)"/m_description="$1"/smg' tmp.xml

这与我需要使用的内容相匹配:(。*?)。 但是我不知道扩展该模式以匹配其中的\\ r \\ n并在结果中进行替换。 如果我知道我可以有多少个\\ r \\ n,但是似乎我需要可变数量的捕获组或类似的东西? 正则表达式有很多我不了解的地方,似乎应该做些什么。

例:

preceding lines 
stuff m_description="Over
any number
of lines" other stuff
more lines

应该去:

preceding lines 
stuff m_description="Over
any number
of lines" other stuff
more lines

感谢Ikegam和ysth提供的解决方案,对于5.14+,它是:

perl -i -0777 -pe's/m_description="\K(.*?)(?=")/ $1 =~ s!\n!
!gr =~ s!\r!
!gr /sge' tmp.xml

. 应该已经匹配\\n (因为您指定了/s标志)和\\r

要替换结果,请使用/e

perl -i -0777 -pe's/(?<=m_description=")(.*?)(?=")/ my $replacement=$1; $replacement=~s!\n!&#10;!g; $replacement=~s!\r!&#13;!g; $replacement /sge' tmp.xml

我还更改了它以使用lookbehind / lookahead简化代码,并使用-0777将$/设置$/ slurp模式并删除无用的/m

好的,虽然这看起来像是XML问题,但事实并非如此。 XML问题是生成它的人。 您可能应该给他们一个带有规格汇总的产品,作为“修复”此问题的第一个呼吁。

否则,我将采用两次通过方法,即阅读文本,找到与描述匹配的所有“斑点”,然后全部替换。

像这样:

#!/usr/bin/env perl

use strict;
use warnings;

use Data::Dumper;

my $text = do { local $/ ;  <DATA> }; 

#filter text for 'description' text: 
my @matches = $text =~ m{m_description=\"([^\"]+)\"}gms;

print Dumper \@matches; 

#Generate a search-and-replace hash
my %replace = map { $_ => s/[\r\n]+/&#13;&#10;/gr } @matches; 
print Dumper \%replace;

#turn the keys of that hash into a search regex
my $search = join ( "|", keys %replace ); 
   $search = qr/\"($search)\"/ms; 

print "Using search regex: $search\n";
#search and replace text block
$text =~ s/m_description=$search/m_description="$replace{$1}"/mgs;

print "New text:\n";
print $text;

__DATA__
preceding lines 
stuff m_description="Over
any number
of lines" other stuff
more lines

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM