在 sed 语句中使用变量

在 sed 语句中使用变量

我想在 /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匹配的内容超出您的预期。

相关内容