Как сопоставить последовательность ../../../ в sed? - PullRequest
0 голосов
/ 04 августа 2020

Как реализовать в sed (regex) следующий вывод? Необходимо извлечь предыдущее '../'

вход

$ ../some/path
$ ../../some/path
$ ../../../any/path/to/folder
$ ../../../../path/to/some/folder

выход

$ ../
$ ../../
$ ../../../
$ ../../../../

Ответы [ 2 ]

0 голосов
/ 04 августа 2020

Я бы просто сделал:

sed 's@/[^.].*@/@' 

или (в зависимости от ввода и желаемого поведения):

sed -E 's@/[^.]+@/@'
0 голосов
/ 04 августа 2020

Сопоставьте все повторяющиеся префиксы ../ с начала и замените остальные ничем:

s#^((\.\./)*).*$#\1#g

с расширенными регулярными выражениями или с базовыми c регулярными выражениями:

s#^\(\(\.\./\)*\).*$#\1#g
  • ^ соответствует началу строки
  • (\.\./) соответствует ../
  • * повторяется 0 или более раз
  • .*$ соответствует rest до конца строки
  • \1 ссылается на первое совпадение группы захвата

НО это, вероятно, легче достигается с помощью grep вместо sed, поскольку вам не нужно выполнять замену (так что, вероятно, немного быстрее):

egrep -o '^(\.\./)*'

-o печатает только соответствующую часть строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...