sed加号不起作用

时间:2014-02-28 15:47:19

标签: regex bash sed

我正在尝试仅在bash脚本中将/.//././/./././替换为/。我已经设法为sed创建了正则表达式,但它不起作用。

variable="something/./././"
variable=$(echo $variable | sed "s/\/(\.\/)+/\//g")
echo $variable # this should output "something/"

当我尝试仅替换/./子字符串时,它与sed \/\.\/中的正则表达式一起使用。 sed正则表达式是否需要更多标志才能将子字符串乘以+*

4 个答案:

答案 0 :(得分:62)

使用-r选项使sed使用扩展正则表达式:

$ variable="something/./././"
$ echo $variable | sed -r "s/\/(\.\/)+/\//g"
something/

答案 1 :(得分:3)

任何sed:

sed 's|/\(\./\)\{1,\}|/|g'

但在这种情况下甚至不需要+\{1,\}*会很好,所以

sed 's|/\(\./\)*|/|g'

应该足够了

答案 2 :(得分:2)

使事情变得简单的两件事:

$ variable="something/./././"
$ sed -r 's#(\./){1,}##' <<< "$variable"
something/
  • 使用{1,}表示一种或多种模式。你不会因此而需要g
  • 在上述情况下使用不同的分隔符#以使其可读
  • +是ERE,因此您需要启用-E-r选项才能使用它

答案 3 :(得分:1)

您也可以使用bash的内置参数替换来完成此操作。这不需要sed,它在OS X下的Mac上不接受-r

variable="something/./././"
a=${variable/\/*/}/                   # Remove slash and everything after it, then re-apply slash afterwards
echo $a
something/

有关解释和其他示例,请参阅here