嘿伙计们我是网站的新手。我正在编写一个安装和配置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`
答案 0 :(得分:1)
你需要在sed替换字符串中使用&
(匹配的内容)“operator”,即
sed -i "/${line}/ s/^${line} */&${get_ip}/" /etc/samba/smb.conf
使用
答案 1 :(得分:1)
您需要以多种方式修改脚本:
hostname -I
似乎依赖于发行版,例如相同的版本1.100(2001-04-14)在CentOS 6.5中有-I
选项,但在Gentoo中没有。也许您可以使用try / catch块来检查它是否有效。^${line}
可能会错过参数。/${line}/ s/${line} */${get_ip}/
的{{1}}中,您无需指定地址范围(/p/ s/p/r/
),因为它与搜索模式相同,因此它等同于/p/
。如果需要替换此参数的整个值,可以使用以下命令:
s/p/r/
这意味着:搜索一个由sed -i "s/\(${line}\).*/\1 ${get_ip}/" /etc/samba/smb.conf
+任意字符组成的组,直到行尾,并将其替换为组+空格+ ${line}
的内容。
如果您需要将值附加到现有值,则可以使用以下内容:
${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}
(第一组)以及零个或一次出现\
个字符(第二组)以外的任何字符的两个组并将其替换为第一组+空格+ \
+空格+第二组内容的内容。