5

我想从 Unix shell 脚本(bash 或 ksh)中的 IP 地址中转义点,以便我可以匹配 grep 命令中的确切地址。

echo $ip_addr | sed "s/\./\\\./g"

有效(输出 1\.2\.3\.4),但是

ip_addr_escaped=`echo $ip_addr | sed "s/\./\\\./g"`
echo $ip_addr_escaped

没有(输出 1.2.3.4)

如何正确转义地址?

编辑: 看起来像

ip_addr_escaped=`echo $ip_addr | sed "s/\./\\\\\\\./g"`

有效,但这显然很糟糕!

4

3 回答 3

12

bash参数扩展支持模式替换,它看起来(稍微)更干净并且不需要调用sed

echo ${ip_addr//./\\.}
于 2013-02-21T14:53:28.377 回答
3

是的,反斜杠的处理是反引号的奇怪引用相关行为之一`...`。与其与之抗争,不如只使用$(...),除了它的引用规则更智能、更直观之外,它是相同的。所以:

ip_addr_escaped=$(echo $ip_addr | sed "s/\./\\\./g")
echo $ip_addr_escaped

但是如果上面的代码确实是你的确切代码——你有一个名为 的参数ip_addr,并且你想替换.\.——那么你可以使用 Bash 的内置符号:${parameter/pattern/string}

ip_addr_escaped=${ip_addr//./\\.}

更确切地说:

grep "${ip_addr//./\\.}" [FILE...]
于 2013-02-21T14:50:17.247 回答
2

用单引号替换双引号。

于 2013-02-21T14:45:23.300 回答