使用sed查找和替换smb.conf文件中的文本

时间:2014-03-30 00:23:15

标签: sed

嘿伙计们我是网站的新手。我正在编写一个安装和配置Samba的bash脚本。我正在使用提示要求用户输入IP地址,然后我想使用输入并将其放入smb.conf文件中的“hosts allow =”。我尝试过使用这个命令:

sed -i "/${line}/ s/^${line} */${get_ip}/" /etc/samba/smb.conf 

但它会删除文件中的hosts allow =。如果有人能帮助我,我会非常感激。

我在sed命令中使用的变量是

line="hosts allow ="
get_ip=`hostname -I`

2 个答案:

答案 0 :(得分:1)

你需要在sed替换字符串中使用&(匹配的内容)“operator”,即

sed -i "/${line}/ s/^${line} */&${get_ip}/" /etc/samba/smb.conf 

使用

答案 1 :(得分:1)

您需要以多种方式修改脚本:

  1. hostname -I似乎依赖于发行版,例如相同的版本1.100(2001-04-14)在CentOS 6.5中有-I选项,但在Gentoo中没有。也许您可以使用try / catch块来检查它是否有效。
  2. 根据the specification,在大多数情况下会忽略空格,因此如果不在行的开头,^${line}可能会错过参数。
  3. 在基本为/${line}/ s/${line} */${get_ip}/的{​​{1}}中,您无需指定地址范围(/p/ s/p/r/),因为它与搜索模式相同,因此它等同于/p/
  4. 如果需要替换此参数的整个值,可以使用以下命令:

    s/p/r/

    这意味着:搜索一个由sed -i "s/\(${line}\).*/\1 ${get_ip}/" /etc/samba/smb.conf +任意字符组成的组,直到行尾,并将其替换为组+空格+ ${line}的内容。

  5. 如果您需要将值附加到现有值,则可以使用以下内容:

    ${get_ip}

    这意味着:搜索sed -i "s/${line}.*/& ${get_ip}/" /etc/samba/smb.conf +任意字符,直到行尾,并将其替换为匹配+ space + ${line}的所有内容。实际上,只有当值只是同一行的一部分时,才会起作用,而不是带有${get_ip}个连续符号的多行字符串(有关详细信息,请参阅here)。要考虑这种情况,请使用以下内容:

    \

    这意味着:搜索包含sed -i "s/\(${line}[^\]*\)\([\]\?\)/\1 ${get_ip} \2/" /etc/samba/smb.conf +除${line}(第一组)以及零个或一次出现\个字符(第二组)以外的任何字符的两个组并将其替换为第一组+空格+ \ +空格+第二组内容的内容。