2015-11-05 94 views
1

我擁有可變數目的下劃線的行。我需要從行尾開始替換第三個下劃線。有沒有sed,awk或任何其他oneliner選項?從末尾開始的每行代替第n個字符串

實施例:

>ABC_BBB_VVV_BBB_NNN 
>ABC_BBB_FFF_VVV_BBB_NNN 

應該變成

>ABC_BBB=VVV_BBB_NNN 
>ABC_BBB_FFF=VVV_BBB_NNN 
+0

看到https://stackoverflow.com/help/someone-answers –

回答

2

這看起來爲從端部的第三_並用=替換它:

$ sed -E 's/_([^_]*_[^_]*_[^_]*)$/=\1/' input 
ABC_BBB=VVV_BBB_NNN  
ABC_BBB_FFF=VVV_BBB_NNN 

這可以是稍微縮寫爲:

sed -E 's/_([^_]*(_[^_]*){2})$/=\1/' input 

以上是針對n=3。對於其他n,只需將2替換爲n-1即可。

+0

謝謝,它的工作。 – fibar

0

假設你希望能夠到該溶液中適應2或4或任何其它數量的從任一端,並使用GNU AWK爲gensub()下劃線的:

$ awk -F_ '{$0=gensub(FS,"=",NF-3)}1' file 
ABC_BBB=VVV_BBB_NNN 
ABC_BBB_FFF=VVV_BBB_NNN 

$ awk -F_ '{$0=gensub(FS,"=",NF-2)}1' file 
ABC_BBB_VVV=BBB_NNN 
ABC_BBB_FFF_VVV=BBB_NNN 

$ awk -F_ '{$0=gensub(FS,"=",NF-4)}1' file 
ABC=BBB_VVV_BBB_NNN 
ABC_BBB=FFF_VVV_BBB_NNN 
+0

這給出了每條具有少於預期下劃線的行的不合格結果(警告消息),例如,爲每個空白行。也許有'NF> n'條件的防守? –

+0

許多可能性來處理,如果任何,如果它可能發生,但由於OP不顯示它在他們的示例輸入/輸出...... –

0

或者AWK:

awk -F_ '{for(i=1;i<NF;++i)printf("%s%c",$i,i==NF-3?"=":"_");printf("%s\n",$NF)}' 
+0

謝謝,它也工作。 – fibar

0
awk '{sub(/_VVV/,"=VVV")}1' file 

>ABC_BBB=VVV_BBB_NNN 
>ABC_BBB_FFF=VVV_BBB_NNN 
相關問題