2016-10-05 71 views
2

我試圖用行集替換包含使用gawk的模式的行。比方說,文件aa包含gawk用於使用變量替換包含具有多行的模式的行使用變量

aaaa 
ccxyzcc 
aaaa 
ddxyzdd 

我使用GAWK更換含有某某用一組線111名\ N222的所有行,我改變的內容將包括:

aaaa 
111 
222 
aaaa 
111 
222 

但是,如果我使用方法:

gawk -v nm2="111\n222" -v nm1="xyz" '{ if (/nm1/) print nm2;else print $0}' "aa" 

更改後的內容顯示:

aaaa 
ccxyzcc 
aaaa 
ddxyzdd 

我需要整行那些包含xyz,即行ccxyzccddxyzdd不得不被替換爲111其次是222。請幫忙。

+1

用'/ NM1 /'你試圖文字字符串匹配 「NM1」。這就是爲什麼你必須說'$ 0〜nm1'來匹配變量'nm1'的內容。 – fedorqui

回答

3

與您的代碼的問題是,/nm1/嘗試匹配nm1作爲圖案不@fedorqui爲建議,next可以通過匹配輸入線直接覆蓋內容避免nm1可變

$ gawk -v nm2="111\n222" -v nm1="xyz" '$0 ~ nm1{print nm2; next} 1' aa 
aaaa 
111 
222 
aaaa 
111 
222 

感謝值圖案與所需文本

gawk -v nm2="111\n222" -v nm1="xyz" '$0 ~ nm1{$0=nm2} 1' aa 


解GNU sed

$ nm1='xyz' 
$ nm2='111\n222' 
$ sed "/$nm1/c $nm2" aa 
aaaa 
111 
222 
aaaa 
111 
222 

c命令將刪除該行匹配模式,並添加給予

+1

不錯!你也可以說'$ 0〜nm1 {$ 0 = nm2} 1',這樣'next'不是必須的。 – fedorqui

+2

並用三元運算符打高爾夫球:'gawk -v nm2 =「111 \ n222」-v nm1 =「xyz」'{print $ 0〜nm1? nm2:$ 0}'文件'。 – fedorqui

1

文本使用awk's~運營商,而你並不需要提供在右手側的文字正則表達式。

你的命令 - 例如具有語法不當的校正會是這樣的,

gawk -v nm2="111\n222" -v nm1="xyz" '{ if ($0 ~ nm1) print nm2;else print $0}' input-file 

產生的輸出。

aaaa 
111 
222 
aaaa 
111 
222 
1

這是我會怎麼做它:

$ cat aa 
aaaa 
ccxyzcc 
aaaa 
ddxyzdd 
$ awk '{gsub(/.*xyz.*/, "111\n222")}1' aa 
aaaa 
111 
222 
aaaa 
111 
222 
$ 
0

傳遞變量模式來AWK始終是一個有點棘手。

awk -v nm2='111\n222' '{if ($1 ~ /xyz/){ print nm2 } else {print}}' 

會給你輸出,但'xyz'模式現在是固定的。

傳遞NM1如shell變量也將工作:

nm1=xyz 
awk -v nm2='111\n222' '{if ($1 ~ /'$nm1'/){ print nm2 } else {print}}' aa 
相關問題