Как сопоставить один или несколько символов, не являющихся слешем

Как сопоставить один или несколько символов, не являющихся слешем

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

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

Связанный контент