Perl替换分隔符

时间:2015-05-18 11:13:19

标签: regex perl perl-module perl-data-structures

我有

之类的CSV文字
1,2,3,{4,5,6,7,8},9,10,100

我想替换{}之间字段的分隔符。该文本应如下所示:

1,2,3,{4|5|6|7|8},9,10,100

我尝试了perl -0777 -pe 's/\{.*?,\}/|/g'

但没有任何反应。我该怎么做呢?

4 个答案:

答案 0 :(得分:2)

这会按照你的要求行事。它将替换所有后跟一系列字符的逗号,这些字符 not 大括号{ },然后是右括号

use strict;
use warnings;
use 5.010;

my $s = '1,2,3,{4,5,6,7,8},9,10,100';

$s =~ s/,(?=[^{}]*\})/|/g;

say $s;

<强>输出

1,2,3,{4|5|6|7|8},9,10,100

答案 1 :(得分:0)

您可以将以下正则表达式与var a = document.querySelector('a'); console.log(a.href); 替换字符串一起使用:

$1$2|

输出:

(\{\s*|(?<!^)\G)(\d+),(?=[,0-9]*\})

Sample code

1,2,3,{4|5|6|7|8},9,10,100

答案 2 :(得分:0)

这是Perl 5.14及更高版本的命令行版本。

perl -pe 's/([{][\d,]+[}])/$1 =~ s~,~|~gr/ge'

/e表示它将替换作为Perl表达式而非标准正则表达式进行评估。这意味着它将获取第一次捕获($1)的值并使用返回(/r)执行替换,以避免尝试修改读取时出错 - 仅值($1)。

答案 3 :(得分:-1)

你可以试试这个:

$st = "1,2,3,{4,5,6,7,8},9,10,100";
if ( $st=~/\{(.*)\}/ ) {
  $tr = $1;
  $tr =~ s/,/|/g;
  $st =~ s/\{*\}/{$tr}/;
  print "$st \n"
}

输出:

1,2,3,{4,5,6,7,8{4|5|6|7|8},9,10,100