简体   繁体   English

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

[英]replace a string in file with awk (like sed -i does)

I have an Openwrt wireless config file. 我有一个Openwrt无线配置文件。 Format is like this: 格式如下:

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'

What I need to do is find exactly wifi-iface 'priv' and change option disabled from 1 to 0. I tried to do it with awk like this: 我需要做的是找到确切的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

Seems fine but I can't do it interactively so file not changed. 看起来不错,但我无法以交互方式进行操作,因此文件未更改。 How to do that if awk doesn't support -i option? 如果awk不支持-i选项,该怎么办?

You can use this awk command with null RS (record separator): 您可以将此awk命令与空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'

Must it be awk ? 一定是awk吗? You could use sed , which does have a -i option: 您可以使用sed ,它确实具有-i选项:

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

Here, the leading address pair restricts the s command to the section with the iface 'priv'. 在这里,前导地址对将s命令限制为具有iface'priv'的部分。

Using GNU awk for -i inplace (and tidying up the script): 将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'

With any other awk you can always do (as with any UNIX command): 使用任何其他awk,您都可以始终这样做(就像使用任何UNIX命令一样):

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

or if you are severely allergic to tmp files: 或如果您对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'

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM