Мне дан относительный путь, который спускается на 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'
../../..
В общем случае вам следует проверить страницу руководства любого инструмента, который вы используете, чтобы узнать, какую версию он использует.