我搜索过,找到了一些我认为应该有用的、信息丰富的答案,但我无法让它们发挥作用。问题是我显然不理解 sed 和所有的斜线,以及它们与正则表达式有什么关系。我想这就是为什么我无法从非常有信息的答案中跨越桥梁(例如sed:-e 表达式对“s”的未知选项) 来帮助我完成这项工作。
/etc/网络/接口:
# WAN (Internet connection)
auto wlp3s0
iface wlp3s0 inet dhcp
dns-nameservers 1.1.1.1 8.8.8.8
wpa-conf /etc/wpa_supplicant_some1.conf
#wpa-conf /etc/wpa_supplicant_oldstuff.conf
bash 脚本:
#!/bin/bash
NEW_LINE="wp-conf /etc/wpa_supplicant_someother.conf"
sed -i '/wpa-conf /c\'"$NEW_LINE" /etc/network/interfaces
上述方法可行。文件中以 wpa-conf 开头的整行都被脚本中的新行替换,这很棒。
但有一个令人讨厌的警告:注释的 wpa-conf 行也发生了变化。这就是我试图避免的。阅读其他答案后,我在脚本中尝试了这些方法,并尝试了许多其他无望的变体,但都无济于事。这些会产生各种错误:
sed -i '/^#/!s/wpa-conf /c\'"$NEW_LINE" /etc/network/interfaces
sed -i '|^#|!s|wpa-conf /c\'"$NEW_LINE" /etc/network/interfaces
sed -i '|^#|!s|wpa-conf |c\'"$NEW_LINE" /etc/network/interfaces
我显然不知道自己在做什么,而且我显然无法理解 sed 的工作原理,而其他答案只会让我的情况变得更糟。
我所做的只是用另一行替换一行,只要它不是注释行。替换行必须以变量的形式给出,因为它来自其他来源,为简洁起见,这里未显示。
问候和感谢
答案1
我会查看第一个答案此条目。如果您只想在以“wpa-conf”开头的行上进行替换,您应该添加^
,这样就可以实现您想要的效果。
sed -i '/^wpa-conf /c\'"$NEW_LINE" /etc/network/interfaces