背景
我想从中获取以下字符串/etc/default/hostapd
并在后面添加某个值=
:
#DAEMON_CONF=""
->DAEMON_CONF="/etc/hostapd/hostapd.conf"
测试
un_comment_and_add_value() {
file="$1"
given_str="$2" ##DAEMON_CONF=""
value="$3" # /etc/hostapd/hostapd.conf
#dont know where to put this in the 'sed' cmd
sed -i "/$given_str/s/^#//g" "$file"
}
un_comment_and_add_value "/etc/default/hostapd" "#DAEMON_CONF=\"\"" "/etc/default/hostapd"
答案1
对于给定的示例,请尝试
sed -i "/^$given_str/{s/.//; s|.$|$value\"|}" "$file"
- 注意双引号的使用,允许变量插值
/^$given_str/
如果给定的字符串在行首匹配s/.//
删除第一个字符s|.$|$value\"|
用给定的替换字符串和双引号替换最后一个字符
进一步阅读:
答案2
$ cat input
#DAEMON_CONF=""
$ key=DAEMON_CONF
$ value="/etc/hostapd/hostapd.conf"
$ sed "/^$key/ { s/^#//; s%=.*%=\"$value\"%; }" input
DAEMON_CONF="/etc/hostapd/hostapd.conf"
这里有两件事。首先,要扩展 shell 变量,需要将它们放在双引号中,而不是单引号中。第二,您需要对替换进行分组,以便它们都依赖于模式匹配。 (或者在每个 之前复制模式匹配s///
。)三,由于替换包含斜杠,我们最好使用其他字符作为 的分隔符s
,例如这里的百分号。
请注意,您需要确保变量value
不包含百分号;如果您需要$
在 sed 命令中插入文字或反斜杠,则需要对它们进行转义,因为 shell 在反斜杠内处理它们。
那么您可能也想考虑这一点: 如何确保插入到“sed”替换中的字符串转义所有元字符
答案3
我通过下面的 sed 命令完成此操作,如有任何问题请告诉我
获取的输入文件如下
猫 /etc/default/hostapd
#DAEMON_CONF=""
命令:
sed -i '/#DAEMON_CONF/s/^#//g' /etc/default/hostapd ; sed -i 's/"/&\/etc\/hostapd\/hostapd.conf/1' /etc/default/hostapd
输出
DAEMON_CONF="/etc/hostapd/hostapd.conf"
答案4
你可以使用这样的东西:
sed -i /etc/default/hostapd -e '/^#DAEMON_CONF=/s;^#\([^=]*\)=.*;\1='"${VALUE}"';'
-i
就地编辑文件/etc/default/hostapd
要编辑的文件/^#DAEMON_CONF=/
过滤器行开头为#DAEMON_CONF=
s;
代替^#\([^=]*\)=.*;
替换整行,但记住变量名、 之间的字符串,#
直到=
,即。在本例中为 DAEMON_CONF\1=${VALUE}
将行替换为${remembered variable name}=${VALUE}