在Bash变量中转义句点

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"`

虽然这个方法能够工作,但显然很糟糕!

3个回答

12

Bash 参数扩展支持模式替换,这将使代码看起来更加简洁,并且不需要调用 sed

echo ${ip_addr//./\\.}

对我来说没问题。另外,您从未提到过 ksh - chepner
抱歉 - 你是对的。我一定是测试错了。(我确实提到了ksh,但没有在问题标题中提及) - Tim Bellis

4

是的,反斜杠的处理是反引号`...`中奇怪的引用相关行为之一。与其与其抗争,不如使用$(...),它的引用规则更加智能和直观。因此:

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...]

1
你不需要转义“.”,因为在glob模式中它没有特殊的含义。 - chepner
@chepner: *测试* 你是对的!那个符号看起来太像Perl或sed了,我总是忘记它只使用通配符符号。我的版本确实可以工作(在发布之前我进行了测试),但是,是的,我会删除额外的反斜杠。谢谢! - ruakh

2

将双引号替换为单引号。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接