用尴尬替换文件中的字符串(例如sed -i确实)



我有一个OpenWrt Wireless配置文件。格式是这样的:

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'priv',然后将选项从1到0禁用。我试图用这样的尴尬做到这一点:

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

看起来不错,但我无法交互作用,因此文件没有更改。如果AWK不支持-i选项,该怎么办?

必须是 awk吗?您可以使用sed,它确实具有-i选项:

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

在这里,领先的地址对将s命令限制为IFACE" PRIV"。

使用gnu awk进行 -i inplace(并整理脚本):

$ cat tst.awk
/config wifi-iface / { f = (/47priv47/ ? 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'

使用任何其他尴尬,您总是可以做的(如任何Unix命令):

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

,或者如果您对TMP文件严重过敏:

$ cat tst.awk
/config wifi-iface / { f = (/47priv47/ ? 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'

您可以使用null RS(记录分隔符)使用此awk命令:

awk -v RS= '/wifi-iface 47priv/{sub(/option disabled [^n]*/, 
       "option disabled 47" 0 "47"); 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'

相关内容

  • 没有找到相关文章

最新更新