2016-02-15 78 views

回答

0

在sed使用以下模式:sed 's/old/new/<number>'

哪裏<number>是希望應用這種模式的次數。

您可以將<number>替換爲g以將模式應用於所有事件。

+2

不,「」用於「只替換正則表達式的numberth匹配」。 –

1

桑達真的不支持的「第一ñ事件」,只有「ñ個發生」的概念; GNU sed有一個用於「替換 -th on」的所有匹配,這不是你想要的在這種情況下。爲了得到前六個逗號代替,你必須調用s命令六次:

sed 's/,/|/;s/,/|/;s/,/|/;s/,/|/;s/,/|/;s/,/|/' infile 

但是,如果你知道有文件中沒有|,你有GNU sed的,你可以這樣做:

sed 's/,/|/g;s/|/,/7g' infile 

這將替換所有逗號與管道,然後從背部到逗號7日開啓的管道。

如果有事先的管道,你可以把它們變成你知道自己是不是在字符串中第一個:

sed 's/|/~~/g;s/,/|/g;s/|/,/7g;s/~~/|/g' infile 

這使得所有|~~第一,那麼所有,| ,然後將|從第7個回到,,最後將~~回到|

測試此輸入文件:

,,,,,,X,,,,,, 
,,,|,,,|,,,|,,,| 

第一和第三命令結果

​​

,因爲已經有管道符第二個將失敗,在第二行。

0

你可以試試這個sed

sed -r ':loop; s/^([^,]*),/\1|/g; /^([^|]*\|){6}/t; b loop' file 

(OR)

sed ':loop; s/^\([^,]*\),/\1|/g; /^\([^|]*|\)\{6\}/t; b loop' file 

測試:

$ cat file 
a,b,c,d,e,f,g,h,i,j,k 

$ sed -r ':loop; s/^([^,]*),/\1|/g; /^([^|]*\|){6}/t; b loop' file 
a|b|c|d|e|f|g,h,i,j,k 

注:如果你不這樣只會工作有任何管道(|)。

1

這可能會爲你工作(GNU SED):

sed 'y/,/\n/;s/\n/,/7g;y/\n/|/' file 

翻譯所有,年代到\n的,然後通過,「從第七\n到線的末端取代S,則更換剩下的\n|的s。

相關問題