Назад | Перейти на главную страницу

Как извлечь последние два (или любое количество) каталога из пути с помощью sed?

Я действительно ищу здесь общее решение, но для примера скажем, что я ищу самый глубокий 2 каталоги в пути. например: задан путь /home/someone/foo/bar, как я могу использовать sed (или awk), чтобы получить foo/bar

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

Если в пути меньше чем n (в данном случае 2) уровня, не важно, как ведет себя команда.

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

echo "/your/directory/here/bla" | awk -F"/" '{ print "/"$(NF-1)"/"$NF }'

должен работать с находкой, я не пробовал, но должно работать что-то вроде этого:

find /yourfolder/structure -type d | awk -F"/" '{ print "/"$(NF-1)"/"$NF }'

FYI, $ NF - это последнее поле, найденное в awk, $ (NF-1), предыдущее.

В awk измените разделитель полей на косую черту:

$ echo /home/someone/foo/bar | awk -F / -v OFS=/ '{ print $(NF-1), $NF }'
foo/bar

Это устанавливает разделитель поля ввода и разделитель поля вывода на косую черту, а затем печатает предпоследнее значение поля, разделитель полей и затем последнее значение поля.

n-значение решение

$ echo /home/someone/foo/bar | awk -F / -v n=3 '
    { o = $NF; for (f=1; f<n; f++) o = $(NF-f) "/" o; print o }
  '
someone/foo/bar

При этом используется цикл для извлечения желаемого количества каталогов.