Sed:用一个下划线replace一系列的点

我想在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应该可以做到。