用awk替换文件中的字符串(如sed -i)

时间:2015-05-12 18:53:05

标签: regex bash awk sed

我有一个Openwrt无线配置文件。 格式是这样的:

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做到这一点:

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

看起来很好,但我不能以交互方式进行,所以文件没有改变。如果awk不支持-i选项怎么办?

3 个答案:

答案 0 :(得分:0)

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

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'

答案 1 :(得分:0)

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

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

这里,前导地址对将s命令限制为iface'priv'部分。

答案 2 :(得分: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'