Regex 从脚本更改WiFi WPA2密钥

Regex 从脚本更改WiFi WPA2密钥,regex,linux,bash,sed,raspberry-pi,Regex,Linux,Bash,Sed,Raspberry Pi,我用的是覆盆子气喘,但这不是一个覆盆子皮的具体问题 我正在开发一个C应用程序,它允许用户更改他们的WiFi密码 我没有找到一个现成的脚本/命令,所以我尝试使用sed 我将SSID名称和新密钥传递给一个bash脚本,然后在*etc/wpa_-supplicant/wpa_-supplicant.conf.*中替换该SSID块的密钥 我的应用程序以root用户身份运行 下面显示了一个示例块 network={ ssid="MY_SSID" scan_ssid=

我用的是覆盆子气喘,但这不是一个覆盆子皮的具体问题

我正在开发一个C应用程序,它允许用户更改他们的WiFi密码

我没有找到一个现成的脚本/命令,所以我尝试使用sed

我将SSID名称和新密钥传递给一个bash脚本,然后在*etc/wpa_-supplicant/wpa_-supplicant.conf.*中替换该SSID块的密钥

我的应用程序以root用户身份运行

下面显示了一个示例块

    network={
        ssid="MY_SSID"
        scan_ssid=1
        psk="my_ssid_psk"
}
到目前为止,我已经尝试了以下内容(我已经将wpa_supplicant.conf复制到wpa.txt以供尝试):

(1) 这将尝试在检测到我的SSID时开始的范围和右大括号后紧跟新行时结束的范围之间进行替换

SSID="TRIMURTI"
PSK="12345678"

sed -n "1 !H;1 h;$ {x;/ssid=\"${SSID}\"/,/}\n/ s/[[:space:]]*psk=.*\n/\n   psk=\"${PSK}\"\n/p;}" wpa.txt

(2) 这将尝试“记住”匹配的模式,并在输出中重现它,但使用新的键

SSID="TRIMURTI"
PSK="12345678"

sed -n "1 !H; 1 h;$ {x;s/\(ssid=\"${SSID}\".*psk=\).*\n/\1\"${PSK}\"/p;}" wpa.txt   
我使用了保持和模式缓冲区,因为模式可以跨越多行

上面,第一个示例似乎忽略了范围&替换第一个实例,然后截断文件的其余部分

第二个示例替换最后找到的psk值,并在其后截断文件


因此,我需要帮助来更正上述代码,或者尝试不同的解决方案。

如果我们可以假设字段总是按照严格的顺序排列,其中
ssid=
位于
psk=
之前,那么您真正需要的就是

 sed "/^[[:space:]]*ssid=\"$SSID\"[[:space:]]*$/,/}/s/^\([[:space:]]*psk=\"\)[^\"]*/\1$PSK/" wpa.txt

但这相当脆弱。如果输入格式不正确,或者如果
ssid
在块中的
psk
之后,它将中断。正确的解决方案(在这种情况下是严重的过度使用)是为输入格式提供适当的解析器;虽然这在理论上在
sed
中是可能的,但如果您使用更高级的语言,如Python或Perl,甚至Awk,则会简单得多。

我想您的代码可能仍然可以工作,但为了正确性,请将
sed-n“1!H;1h;$…
更改为
sed-n”1!H1小时;\$
sed
在这里是有问题的,因为您基本上不允许使用任何字符作为正则表达式分隔符。这里有很多方法,但是也许你应该考虑切换到一个代码和数据不混合的工具,请帮助。我正在寻找通过脚本更改WiFi WPA2密钥的方法。没有人尝试过这个吗?谢谢你,特里普利,我收到以下错误:./chPSK.sh:第18行:在查找匹配的“%”时出现意外的EOF./chPSK.sh:第19行:语法错误:意外的文件结尾,其中,chPSK.sh是我的脚本文件,而你的sed代码在第18行。好的,我更正了你的代码。[^“]应该是[^\]。此外,您在最后一个“。(实际上,这里不需要大括号);-)之前忘记了右大括号现在它起作用了。让我测试一下。。。谢谢你给我指明了正确的方向:-)。也许你应该编辑你的代码让我把它标记为答案?谢谢,我被打断了,没有时间测试-/只是一张纸条。。。您需要在最后一个“”之前添加一个右括号。感谢您的帮助!或删除错误的右括号。现在更新。感谢您的坚持(-: