Perl单线重复替换

时间:2016-02-13 14:31:00

标签: regex perl

我想重复此搜索,直到文本中没有可用的匹配项:

perl -pi -e 's/(<langSet xml.lang=....>)\s*<tig>(.*?)<\/tig>\s*<tig>/\1<tig>\2<\/tig>\1<tig>/g' iate.dsl

基本上,我需要一个单线程形式的while循环,这将使线条看起来有点像这样

<langSet...><tig>...</tig><tig>...</tig><tig>...</tig><tig>...</tig>

并返回类似这样的内容

<langSet...><tig>...</tig><langSet...><tig>...</tig><langSet...><tig>...</tig><langSet...><tig>...</tig>

其中<tig>个实例的数量因每行而异。

2 个答案:

答案 0 :(得分:0)

对于第一个这不是&#34;搜索&#34;,这是&#34;替换&#34;而第二个想法是,你不需要一个while循环,导致一个衬里&#39;读出每一行。

但你可以使用&#34; if-statement&#34;喜欢 - &gt; &m; foo / i&#39;或类似的想法,就像ternare if-then-else但是,没有必要。我会先用旗帜&#34; -p&#34;进行检查。没有&#34; -i&#34; (不是&#34; -pi&#34;),先检查输出。

示例:

 perl -p -e 's/(<langSet xml.lang=....>)\s*<tig>(.*?)<\/tig>\s*<tig>/\1<tig>
\2<\/tig>\1<tig>/g if m/(<langSet xml.lang=....>)\s*<tig>(.*?)<\/tig>
\s*<tig>/gi' iate.dsl
祝你好运。

答案 1 :(得分:0)

这有效:

perl -p -i -e 's/(<langSet xml.lang=....>)\s*<tig>(.*?)<\/tig>\s*<tig>/\1<tig>\2<\/tig>\1<tig>/g while m/(<langSet xml.lang=....>)\s*<tig>(.*?)<\/tig>\s*<tig>/gi' iate.dsl