sed使用正则表达式查找和替换n个实例

时间:2014-11-06 18:11:28

标签: regex awk sed

我有一个包含一些看起来像这样的行的文件: -

DUMMY name, 4, 6, 5*0, 34, 322552
DUMMY same, 4, 6, 2*2, 34, 322552

我想将"m*n"的所有实例替换为m重复值n,即将"5*0,"替换为"0, 0, 0, 0, 0,""2*2"使用"2, 2,",因此上述行的输出应如下所示: -

DUMMY name, 4, 6, 0, 0, 0, 0, 0, 34, 322552
DUMMY same, 4, 6, 2, 2, 34, 322552

到目前为止,我已设法识别“m * n”的所有实例,并且可以使用sed替换为m或(在下面的行中)n: -

sed -r 's/([0-9])(\*)([0-9]),/\3,/g'

但我无法弄清楚如何让它重复正则表达式\3 m次。

4 个答案:

答案 0 :(得分:0)

使用gnu-awk

可以轻松完成
awk 'BEGIN{FS=OFS=", "} {for (f=1; f<=NF; f++) if (match($f, /([0-9]+)\*([0-9]+)/, a)) 
      {s=a[2]; for (i=1; i<a[1]; i++) s = s OFS a[2]; $f=s} } 1' file
DUMMY name, 4, 6, 0, 0, 0, 0, 0, 34, 322552
DUMMY same, 4, 6, 2, 2, 34, 322552

答案 1 :(得分:0)

$ awk 'BEGIN{FS=OFS=", "}
{
    for (i=1;i<=NF;i++) {
        if ( split($i,a,/\*/) > 1 ) {
            for (j=1;j<=a[1];j++) {
                $i = (j>1 ? $i OFS : "") a[2]
            }
        }
    }
}
1' file
DUMMY name, 4, 6, 5*0, 34, 322552
DUMMY same, 4, 6, 2*2, 34, 322552

答案 2 :(得分:0)

你可以试试这个。 perl在命令行上。

cat filename | perl -ne '$mystring = $_ ;if (~/(\d+)\*(\d+)/) { $a = join(",",map{" $2"}(1..$1));$mystring =~ s/ \d+\*\d+/$a/;print $mystring}'

答案 3 :(得分:0)

不幸的是,当您发现通用的vanilla sed不支持RHS上的速记重复语法时,所以要使用sed,您必须处理每个案例:

sed 's/9\*\(.\)/\1, \1, \1, \1, \1, \1, \1, \1, \1/;s/8\*\(.\)/\1, \1, \1, \1, \1, \1, \1, \1/;s/7\*\(.\)/\1, \1, \1, \1, \1, \1, \1/;s/6\*\(.\)/\1, \1, \1, \1, \1, \1/;s/5\*\(.\)/\1, \1, \1, \1, \1/;s/4\*\(.\)/\1, \1, \1, \1/;s/4\*\(.\)/\1, \1, \1, \1/;s/3\*\(.\)/\1, \1, \1/;s/2\*\(.\)/\1, \1/;s/1\*\(.\)/\1/;'

EG。
echo "DUMMY name, 4, 6, 5*0, 34, 322552" | sed 's/9\*\(.\)/\1, \1, \1, \1, \1, \1, \1, \1, \1/;s/8\*\(.\)/\1, \1, \1, \1, \1, \1, \1, \1/;s/7\*\(.\)/\1, \1, \1, \1, \1, \1, \1/;s/6\*\(.\)/\1, \1, \1, \1, \1, \1/;s/5\*\(.\)/\1, \1, \1, \1, \1/;s/4\*\(.\)/\1, \1, \1, \1/;s/4\*\(.\)/\1, \1, \1, \1/;s/3\*\(.\)/\1, \1, \1/;s/2\*\(.\)/\1, \1/;s/1\*\(.\)/\1/;'

Output:
DUMMY name, 4, 6, 0, 0, 0, 0, 0, 34, 322552

echo "DUMMY same, 4, 6, 2*2, 34, 322552" | sed 's/9\*\(.\)/\1, \1, \1, \1, \1, \1, \1, \1, \1/;s/8\*\(.\)/\1, \1, \1, \1, \1, \1, \1, \1/;s/7\*\(.\)/\1, \1, \1, \1, \1, \1, \1/;s/6\*\(.\)/\1, \1, \1, \1, \1, \1/;s/5\*\(.\)/\1, \1, \1, \1, \1/;s/4\*\(.\)/\1, \1, \1, \1/;s/4\*\(.\)/\1, \1, \1, \1/;s/3\*\(.\)/\1, \1, \1/;s/2\*\(.\)/\1, \1/;s/1\*\(.\)/\1/;'

Output:
DUMMY same, 4, 6, 2, 2, 34, 322552