【发布时间】:2018-09-12 18:50:20
【问题描述】:
我有一个文件 1.txt,内容如下
F1,F2,[as1,as2],[as3,as4]
F3,F4,F5,[as5,as6]
我需要在 perl 中编写一个正则表达式,以便将 [' and '] 之间的分隔符 ',' 更改为 | 。
我在下面尝试过,但没有成功。
@qr = $st = /\{(.*)(\|)+\}/;
$st 有输入字符串。
【问题讨论】:
我有一个文件 1.txt,内容如下
F1,F2,[as1,as2],[as3,as4]
F3,F4,F5,[as5,as6]
我需要在 perl 中编写一个正则表达式,以便将 [' and '] 之间的分隔符 ',' 更改为 | 。
我在下面尝试过,但没有成功。
@qr = $st = /\{(.*)(\|)+\}/;
$st 有输入字符串。
【问题讨论】:
对于早于 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+ 个字符)比[ 和],然后]) 并在这些匹配项中执行替换:
echo "F1,F2,[as1,as2],[as3,as4]" | perl -lpe 's/(\[[^][]+])/$1=~s#,#|#gr/ge'
# => F1,F2,[as1|as2],[as3|as4]
请参阅online demo。
【讨论】:
#。或者用{...} 括起来。但请务必使用与我上面示例中相同的修饰符。我看到你从正则表达式中删除了它们。看看this demo。
一个简单的单线可以解决你的任务:
输入:
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]
【讨论】: