bash变量中的转义点

bash变量中的转义点,bash,shell,Bash,Shell,我想在unixshell脚本(bash或ksh)中从IP地址中转义点,以便能够匹配grep命令中的确切地址 echo $ip_addr | sed "s/\./\\\./g" 工作(输出1\.2\.3\.4),但 没有(输出1.2.3.4) 我怎样才能正确地转义地址 编辑: 看起来像 ip_addr_escaped=`echo $ip_addr | sed "s/\./\\\\\\\./g"` 行得通,但那显然很糟糕 用单引号替换双引号。是的,反斜杠的处理是反斜杠的奇怪引用相关行为之一。与其

我想在unixshell脚本(bash或ksh)中从IP地址中转义点,以便能够匹配grep命令中的确切地址

echo $ip_addr | sed "s/\./\\\./g"
工作(输出1\.2\.3\.4),但

没有(输出1.2.3.4)

我怎样才能正确地转义地址

编辑: 看起来像

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

行得通,但那显然很糟糕

用单引号替换双引号。

是的,反斜杠的处理是反斜杠的奇怪引用相关行为之一。与其与之抗争,不如直接使用
$(…)
,这是相同的,只是它的引用规则更智能、更直观。因此:

ip_addr_escaped=$(echo $ip_addr | sed "s/\./\\\./g")
echo $ip_addr_escaped
但是如果上面的代码确实是您的代码-您有一个名为
ip\u addr
,并且您想用
\.
替换
。-那么您可以使用Bash的内置
${parameter/pattern/string}
符号:

ip_addr_escaped=${ip_addr//./\\.}
或者更确切地说:

grep "${ip_addr//./\\.}" [FILE...]

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

echo${ip\u addr/././\\.}

您不需要转义“.”,它在全局模式中没有特殊意义。@chepner:*测试*您是对的!在我看来,这种表示法非常类似于Perl或sed,以至于我总是忘记它只使用glob表示法。我的版本确实有效(我在发布之前测试过),但是是的,我会删除额外的反斜杠。谢谢对我来说是的。还有,你从来没有提到过ksh。对不起,你说得对。我一定是测试错了。(我确实提到了ksh——但不是在问题标题中)
grep "${ip_addr//./\\.}" [FILE...]