我想在 /etc/hosts 文件中用 $IP 替换第二次出现的 127.0.0.1。
/etc/hosts 中两次出现 127.0.0.1:
127.0.0.1 localhost.localdomain localhost
127.0.0.1 hostname.com hostname
IP=192.168.1.1
我尝试使用这个 sed 表达式将 127.0.0.1 替换为 $IP:
sed -i ":a;N;$!ba;s|127.0.0.1|$IP|2" /etc/hosts
问题是 $IP 没有被解释。我怎样才能让 $IP 被解释而不是逐字替换?
答案1
一个简单的解决方法是修改您的引用:
sed -i ':a;N;$!ba;s|127.0.0.1|'$IP'|2' /etc/hosts
您的版本的问题很可能是:a;N;$!ba
被 shell 扩展为::a;N;ba
。您可以通过echo
在 前面放置 来测试这一点sed
。
在 bash 中,该变量$!
包含最近执行的后台管道的进程 ID。
请注意,.
匹配任何单个字符,而不仅仅是句点,因此127.0.0.1
匹配的内容超出您的预期。