如何匹配一個或多個非斜線字符

如何匹配一個或多個非斜線字符

我得到了一條下降 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'
../../../

FWIW,星號 (*) 將代替加號 (+):

$ 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'
../../..

一般來說,您需要檢查您正在使用的任何工具的手冊頁,以了解它使用的風格。

相關內容