如何匹配一个或多个非斜杠字符

如何匹配一个或多个非斜杠字符

我获得了一条下降 n 层的相对路径,并希望生成一条上升相同层数的“反向”路径。我希望生成相同数量的层数,无论是否带有尾随空格。例如:

dir/subdir/subsubdir  should produce ../../..
dir/subdir/subsubdir/ should produce ../../../

为什么加号运算符找不到匹配项?这难道不意味着有一个或多个非斜线字符吗?

$ echo dir/subdir/subsubdir | sed 's|[^/]+|..|g'
dir/subdir/subsubdir

而单个字符匹配后跟星号匹配则有效:

$ echo dir/subdir/subsubdir | sed 's|[^/][^/]*|..|g'
../../..

即使带有尾部斜杠:

$ echo dir/subdir/subsubdir/ | sed 's|[^/][^/]*|..|g'
../../../

值得注意的是,星号(*)可以代替加号(+):

$ echo dir/subdir/subsubdir | sed 's|[^/]*|..|g'
../../..

但是尾随斜杠不行,因为它会增加另一个级别:

$ echo dir/subdir/subsubdir/ | sed 's|[^/]*|..|g'
../../../../..

答案1

不幸的是,正则表达式语法有很多种,每种都有自己的细微(有时不是那么细微)变化。假设您使用的是 GNU sed,则以下任一选项都可以使用:

$ echo dir/subdir/subsubdir | sed 's|[^/]\+|..|g'
../../..
$ echo dir/subdir/subsubdir | sed -r 's|[^/]+|..|g'
../../..

一般来说,您需要检查所用工具的手册页以了解其使用的风格。

相关内容