2015-05-12 77 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文件的情况下做到这一点,它不值得费神。我将编辑我的问题以显示它。完成。 –