2015-05-12 76 views
1

我有一個Openwrt無線配置文件。 格式是這樣的:使用awk替換文件中的字符串(如sed -i)

config wifi-iface 'priv' 
    option device 'radio0' 
    option ifname 'priv0' 
    option mode 'ap' 
    option encryption 'psk-mixed' 
    option macfilter 'allow' 
    option macfile '/tmp/mac_filter_priv' 
    option disabled '1' 
    option hidden '1 

config wifi-iface 'orphan' 
    option device 'radio0' 

我需要做的是準確地找到WiFi的IFACE「私法」和變化選項1禁用0 我試着用awk來做到這一點是這樣的:

awk 'BEGIN{f=0} /wifi-iface \47priv/{f=1} {if(f==1 && $2=="disabled") 
{gsub("1", "0"); f=0; print}}' wireless 

似乎很好,但我不能交互地做它,所以文件沒有改變。如果awk不支持-i選項,該怎麼做?

+0

你可以運行多個以分號或'&&'分隔的命令嗎?您可以隨時複製文件,覆蓋原件,然後一次刪除複印件。例如:'cp wireless wireless.bak && awk'代碼在這裏'wireless.bak> wireless && rm wireless.bak' –

回答

0

您可以使用空RS(記錄分隔符)此awk命令:

awk -v RS= '/wifi-iface \047priv/{sub(/option disabled [^\n]*/, 
     "option disabled \047" 0 "\047"); print $0 ORS; next} 1' config 
config wifi-iface 'priv' 
    option device 'radio0' 
    option ifname 'priv0' 
    option mode 'ap' 
    option encryption 'psk-mixed' 
    option macfilter 'allow' 
    option macfile '/tmp/mac_filter_priv' 
    option disabled '0' 
    option hidden '1 
config wifi-iface 'orphan' 
    option device 'radio0' 
+0

謝謝,但它也刪除了所有我希望保留的空行。 – pulse

+0

這可以通過使用'awk -v RS = -v ORS ='\ n \ n''...''來實現。 – anubhava

+0

它適合你嗎? – anubhava

0

,它必須得到awk?你可以使用sed,它確實有一個-i選項:

sed -i "/^config wifi-iface 'priv'/,/^config /s/\(disabled\) '1'/\1 '0'/" wireless 

這裏,領先的地址對限制s命令與IFACE「私法」的部分。

+0

sed工作正常,謝謝)我決定知道如何強大的awk可以做的伎倆:) – pulse

+0

'sed -i「/^config wifi-iface'priv'/,/ option disabled/s /'1'/'0'/'wireless' – Costas

+0

科斯塔斯,這也將編輯任何選項之前「禁用」,恰好有一個'1'。 –

0

使用GNU AWK爲-i inplace(和整理腳本):

$ cat tst.awk 
/config wifi-iface/{ f = (/\047priv\047/ ? 1 : 0) } 
f && $2=="disabled" { sub(/1/,"0") } 
{ print } 

$ awk -i inplace -f tst.awk file 

$ cat file 
config wifi-iface 'priv' 
    option device 'radio0' 
    option ifname 'priv0' 
    option mode 'ap' 
    option encryption 'psk-mixed' 
    option macfilter 'allow' 
    option macfile '/tmp/mac_filter_priv' 
    option disabled '0' 
    option hidden '1 

config wifi-iface 'orphan' 
    option device 'radio0' 

隨着你總是可以做任何其他的awk(與任何UNIX命令):

awk -f tst.awk file > tmp && mv tmp file 

,或者如果您對tmp文件有嚴重過敏:

$ cat tst.awk 
/config wifi-iface/{ f = (/\047priv\047/ ? 1 : 0) } 
f && $2=="disabled" { sub(/1/,"0") } 
{ rec = rec $0 RS } 
END { close(FILENAME); printf "%s", rec > FILENAME } 

$ awk -f tst.awk file 

$ cat file 
config wifi-iface 'priv' 
    option device 'radio0' 
    option ifname 'priv0' 
    option mode 'ap' 
    option encryption 'psk-mixed' 
    option macfilter 'allow' 
    option macfile '/tmp/mac_filter_priv' 
    option disabled '0' 
    option hidden '1 

config wifi-iface 'orphan' 
    option device 'radio0' 
+0

正如我所說沒有-i就地選項。我在考慮沒有tmp文件的解決方案,但沒有這樣的解決方案。現在我也知道sed -i以相同的方式做了相同的處理 - 使用tmp文件。 – pulse

+0

你絕對可以在沒有非GNU awk的tmp文件的情況下做到這一點,它不值得費神。我將編輯我的問題以顯示它。完成。 –