在某行之前替换最新出现的字符串

时间:2016-08-03 16:44:20

标签: awk replace sed

我想将ignore_broadcast_ssid=0替换为ignore_broadcast_ssid=1
在文件/var/run/hostapd-phy0.conf内。

这就是我如何找到字符串之前字符串的行号:

LINE=$(grep -n "bss=wlan0-2" | cut -d':' -f1)

这就是如何替换后面的

sed $LINE's/ignore_broadcast_ssid=0/ignore_broadcast_ssid=1/g' /var/run/hostapd-phy0.conf

但是由于块的第一行并不总是bss=wlan0-2,我怎么才能在同一个块内的ssid=temp_wifi部分内部替换,但之前找到的字符串?

...

bss=wlan0-2
ctrl_interface=/var/run/hostapd
ap_isolate=1
disassoc_low_ack=1
preamble=1
wmm_enabled=1
ignore_broadcast_ssid=0
uapsd_advertisement_enabled=1
auth_algs=1
wpa=0
ssid=temp_wifi
bridge=br-client
bssid=a0:f3:c1:d8:b7:7c

interface=client0
ctrl_interface=/var/run/hostapd
ap_isolate=1
disassoc_low_ack=1
preamble=1
wmm_enabled=1
ignore_broadcast_ssid=0
...

1 个答案:

答案 0 :(得分:1)

从你的问题中不清楚(你试图解决的实际问题被你的问题重点放在如何使用你开始的方法来解决问题),但听起来你只是想要替换一些包含ssid = temp_wifi的块中包含其他文本的文本,并且只是这样:

$ awk -v RS= -v ORS='\n\n' '/ssid=temp_wifi/{sub(/ignore_broadcast_ssid=0/,"whatever")} 1' file
...

bss=wlan0-2
ctrl_interface=/var/run/hostapd
ap_isolate=1
disassoc_low_ack=1
preamble=1
wmm_enabled=1
whatever
uapsd_advertisement_enabled=1
auth_algs=1
wpa=0
ssid=temp_wifi
bridge=br-client
bssid=a0:f3:c1:d8:b7:7c

interface=client0
ctrl_interface=/var/run/hostapd
ap_isolate=1
disassoc_low_ack=1
preamble=1
wmm_enabled=1
...

以上使用您问题中的文本块作为输入。