在两个字符串模式之间替换多次出现的char

时间:2017-04-07 08:53:32

标签: regex perl

我有一个文件1.txt,内容低于

F1,F2,[AS1,AS2],[AS3,AS4]

F3,F4,F5,[AS5,AS6]

我需要在perl中编写一个正则表达式,这样我才能更改分隔符','介于[' and ']|之间。

我在下面试过,但它没有用。

@qr = $st = /\{(.*)(\|)+\}/;

其中$st有输入字符串。

2 个答案:

答案 0 :(得分:1)

对于早于Perl 5.14的Perl版本,你不能使用像

这样的正则表达式
echo "[as1,as2,as3],[as4,as5]" | perl -lpe 's/(?:\[|\G(?!^))[^]]*?\K,/|/g'

请参阅online demo

模式详情

  • (?:\[|\G(?!^)) - 文字[或上一场比赛的结尾(\G(?!^)
  • [^]]*? - 除]之外的零个或多个字符,尽可能少匹配
  • \K - 删除整个匹配值
  • , - 匹配中的逗号(已替换为|)。

对于Perl版本5.14及更新版本(其中r修饰符出现),您可以将[...]子字符串与\[[^][]+]正则表达式匹配({{1}然后是[[以外的1 +个字符,然后是])并在这些匹配项中执行替换:

]

请参阅online demo

答案 1 :(得分:1)

简单的单行程可以解决您的任务:

输入:

F1,F2,[as1,as2],[as3,as4]

F3,F4,F5,[as5,as6]

perl -lpe 's/\[(.*?),(.*?)\]/[$1|$2]/g' file

输出:

F1,F2,[as1|as2],[as3|as4]

F3,F4,F5,[as5|as6]