sed 用于替换文件中的非注释行

sed 用于替换文件中的非注释行

我搜索过,找到了一些我认为应该有用的、信息丰富的答案,但我无法让它们发挥作用。问题是我显然不理解 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

相关内容