2013-02-21 78 views
1

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

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

作品(输出1 \ 0.2 \ 0.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

bash参数EXP安森支持模式替换,这将看(略)清洁并且不需要以sed呼叫:

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

谢谢。虽然在ksh中不起作用。 – 2013-02-26 13:38:00

+0

它适合我。另外,你从来没有提到'ksh'。 – chepner 2013-02-26 13:51:43

+0

对不起 - 你是对的。我必须错误地测试它。 (我提到了ksh - 但不是在问题标题中) – 2013-02-26 15:17:19

2

用单引号替换双引号。

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

您不必逃避,不具有在水珠特殊的意义“”模式。 – chepner 2013-02-21 14:55:09

+0

@chepner:\ * tests \ *您说得对!这个符号看起来很像Perl或sed给我,我总是忘记它只是使用glob符号。我的版本确实有效(我在发布前测试过),但是,我会删除额外的反斜杠。谢谢! – ruakh 2013-02-21 14:56:48