Мне дан относительный путь, который спускается на 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 ответ1

1

К сожалению, существует множество разновидностей синтаксиса регулярных выражений, каждый из которых имеет свои небольшие (или иногда не очень) вариации. Предполагая, что вы используете GNU sed, любой из этих параметров будет работать:

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

В общем, вы захотите проверить справочную страницу любого используемого вами инструмента, чтобы увидеть, какой аромат он использует.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .