我想在Bash中用sed做一些简单的stringreplace。 我是Ubuntu 10.10。
只要看下面的代码,这是不言自明的:
name="A%20Google.." echo $name|sed 's/\%20/_/'|sed 's/\.+/_/'
我想获得A_Google_
但获得A_Google..
sed 's/\.+/_/'
部分显然是错误的。
顺便说一句, sed 's/\%20/_/'
和sed 's/%20/_/'
都可以。 哪个更好?
sed
讲POSIX的基本正则表达式,不包括+
作为元字符。 可移植的,重写使用*
:
sed 's/\.\.*/_/'
或者如果你所关心的只是Linux,你可以使用各种GNU-isms:
sed -r 's/\.\.*/_/' # turn on POSIX EREs (use -E instead of -r on OS X) sed 's/\.\+/_/' # GNU regexes invert behavior when backslash added/removed
最后一个例子回答了你的另一个问题:一个字符在使用时是字面的,在反斜杠时可能会有特殊的含义,即使此时 %
没有特殊的含义,未来的证明意味着不能假设\%
是安全的。
附加说明:在这里你不需要两个单独的sed
命令。
echo $name | sed -e 's/\%20/_/' -e 's/\.+/_/'
(另外,你只需要每行执行一次或者所有的事件?你可能需要/g
修饰符。)
sed
命令不理解+
所以你必须手动扩展它:
sed 's/\.\.*/_/'
或者告诉sed
你想使用扩展正则表达式:
sed -r 's/\.+/_/' # GNU sed -E 's/\.+/_/' # OSX
哪个开关, -r
或-E
,取决于你的sed
,甚至可能不支持扩展正则表达式,所以便携式解决方案是用\.\.*
代替\.+
。 但是,因为你在Linux上,所以你应该有GNU sed
所以sed -r
应该可以做到。