我试图将/./
或/././
或/./././
替换为仅在bash脚本中/
。我已经设法为 sed 创建了正则表达式,但它不起作用。
variable="something/./././"
variable=$(echo $variable | sed "s//(./)+///g")
echo $variable # this should output "something/"
当我尝试仅替换/./
子字符串时,它适用于 sed /./
中的正则表达式。sed 正则表达式是否需要更多标志才能使用子字符串与 +
或 *
的乘法?
使用-r
选项使sed
使用扩展正则表达式:
$ variable="something/./././"
$ echo $variable | sed -r "s//(./)+///g"
something/
任何 sed:
sed 's|/(./){1,}|/|g'
但是在这种情况下甚至不需要+
或{1,}
,*
会做得很好,所以
sed 's|/(./)*|/|g'
应该足够了
简化两件事:
$ variable="something/./././"
$ sed -r 's#(./){1,}##' <<< "$variable"
something/
- 使用
{1,}
指示一个或多个模式。你不需要g
这个。 - 在上述情况下
#
使用不同的分隔符以使其可读 -
+
是 ERE,因此您需要启用-E
或-r
选项才能使用它
你也可以使用 bash 的内置参数替换来做到这一点。这不需要 sed
,它不接受 OS X 下的 Mac 上的-r
:
variable="something/./././"
a=${variable//*/}/ # Remove slash and everything after it, then re-apply slash afterwards
echo $a
something/
有关解释和其他示例,请参阅此处。