2014-11-06 62 views
2

我有一個包含一些線條看起來像這樣的文件有n個實例替換: -SED找到並使用正則表達式

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

我欲與君nm重複值替換的"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」和LL實例可以用米或(在下面的線)N使用SED替代: -

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

,但我不能工作,如何讓它重複的正則表達式\3 m倍。

回答

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 
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 
0

你可以試試這個。 perl在命令行上。

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

不幸的是,你發現了通用的香草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 
+0

感謝。我有一種嘮叨的感覺,我錯過了一些顯而易見的東西,但是從你說的東西中可以看出它缺少了什麼! – 2014-11-07 08:54:38