我有一个包含一些看起来像这样的行的文件: -
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
次。
答案 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