2016-08-12 101 views
0

我對bash/unix編程頗爲陌生。不過,我有一個問題,我無法弄清楚。以最基本的方式來說,我的csv文件有一個類似於下面的表格。用Sed/Awk/Grep替換基於行首的中間行

原文:

TYPE1, text, text, text, Hello, text, text 
TYPE2, text, text, Hello, text, text, text 

輸出:

TYPE1, text, text, text, RESULT1, text, text 
TYPE2, text, text, RESULT2, text, text, text 

我試圖以不同的方式取代「你好」的字符串,基於哪種類型的文本是在第一列。

我已經創建了替換'你好'的代碼,如果它被發現,但我無法弄清楚如何對第一列作出反應。

非常感謝您的任何幫助。

回答

0

您可以使用sed

sed -r 's/(^[ \t]*TYPE)([0-9])(,.*)Hello/\1\2\3RESULT\2/' filename 

在上述命令,TYPE後的數目由()在搜索文本sorround,和\2用於在替換文本中替換文本RESULT之後將其追加。這通常稱爲反向參考。

你可以谷歌關於「sed搜索和替換」,以及如何在sed中使用反向引用。最重要的是搜索和學習「正則表達式」。

1

這AWK的一行應該做你想要什麼:

awk -F',' '{t=$1;sub(/TYPE/,"",t);gsub(/Hello/,"RESULT"t);print}' file 
  • sub()獲取第一列中的數字,並在VAR節省t
  • gsub()改變所有HelloRESULT + t
0

假設你不是真的只想剝去「TYPE」到與1或2個左釘在結果的末尾,但實際上要測試/設定具體數值,

$ awk 'BEGIN{FS=OFS=", "} {sub(/Hello/,($1=="TYPE1" ? "RESULT1" : "RESULT2"))} 1' file 
TYPE1, text, text, text, RESULT1, text, text 
TYPE2, text, text, RESULT2, text, text, text 
0

要如何在第一列的反應你沒有明確。當規則是@sps的解決方案太複雜,你可以嘗試其他的東西:

sed '/^TYPE1,/ s/Hello/Result1/g; 
    /^TYPE2,/ s/Hello/OtherResult/g' yourcsvfile 

當你有很多的翻譯​​,需要有時會改變他們,你想將它們寫在配置文件中。 sed命令需要讀取配置文件,並且可能會給像=/#,這樣的字符和正則表達式中具有特殊含義的字符帶來問題。 使用配置文件可能的工作就像

# Make configfile 
echo "TYPE1=Result1 
TYPE2=OtherResult2" > translatecsv.cfg 

# test the new cfg file, will it give valid sed commands? 
sed 's#\(.*\)=\(.*\)#/^\1/ s/Hello/\2/g;#;' translatecsv.cfg 

# All together now 
sed "$(sed 's#\(.*\)=\(.*\)#/^\1/ s/Hello/\2/g;#;' translatecsv.cfg)" yourcsvfile 
0

另一awk將與任何單個位數

$ awk 'match($1,/^TYPE/){sub("Hello", "RESULT"substr($1,RLENGTH+1,1))}1' file 

TYPE1, text, text, text, RESULT1, text, text 
TYPE2, text, text, RESULT2, text, text, text 
0

另一個AWK工作(以及GAWK實際上)使用gensub和逆向引用:

awk '{print gensub(/^(TYPE)([^,]+)((.*)(Hello))*/,"\\1\\2\\4RESULT\\2","g",$0)}' file 

如果記錄中有多個匹配項,則匹配最後一個匹配其中某些其他答案的最後一個匹配項 第一。