我正在尝试仅在bash脚本中将/./
或/././
或/./././
替换为/
。我已经设法为sed创建了正则表达式,但它不起作用。
variable="something/./././"
variable=$(echo $variable | sed "s/\/(\.\/)+/\//g")
echo $variable # this should output "something/"
当我尝试仅替换/./
子字符串时,它与sed \/\.\/
中的正则表达式一起使用。 sed正则表达式是否需要更多标志才能将子字符串乘以+
或*
?
答案 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。