使用“sed”,如何在字符串中的“=”符号后添加值?

使用“sed”,如何在字符串中的“=”符号后添加值?

背景

我想从中获取以下字符串/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}

相关内容