Как мне вырезать все символы после последнего '/'?
Этот текст
xxxx/x/xx/xx/xxxx/x/yyyyy
xxx/xxxx/xxxxx/yyy
должен вернуться
xxxx/x/xx/xx/xxxx/x
xxx/xxxx/xxxxx
command-line
text-processing
Йозеф Климук
источник
источник
basename
иdirname
сделать это уже./
» стало «Как вырезать все символы после последнего« / »?» который является изменением формулировки, которая разумно сохраняет значение, ИМО. Во всяком случае, я чувствовал, что часть «пропустить то, что ...» неоднозначна: примеры, кажется, сохраняют то, что есть до/
. Во всяком случае, этот пример проясняет ситуацию.Ответы:
Если вы хотите получить «вырезанную часть»
Ты можешь использовать
например.
вывод
(Примечание: в нем используется возможность sed использовать разделитель, отличный от /, в данном случае |, в команде s)
Если вы хотите получить начало строки:
Ты можешь использовать
например.
вывод
источник
#
вместо/
. Также вы можете использовать опцию ,-r
если вы не хотите , чтобы избежать `\` каждого специального символа:sed -r 's#(^.*)/.*$#\1#'
.Если вы вырежете от концов строк,
dirname
могли бы соответствовать всем требованиям:Если вы пытаетесь изолировать последнюю часть строки, используйте
echo /$(basename "$str")
.источник
dirname
иbasename
не широко известны, ноsed
иawk
есть.cat text | basename
не будут работать. Таким образом, правильное решение вопроса OP с использованиемdirname
иbasename
будет включать в себяxargs
и т.д.Расширение параметра в
bash
Вы можете использовать расширение параметра
bash
, в этом случае${parameter%word}
гдеword
находится/*
${parameter##word}
гдеword
находится*/
Примеры:
Удалить последнюю часть
Это описано в
man bash
:Удалить все, кроме последней части
Вы можете добавить косую черту, как так
чтобы получить именно то, что вы хотели в одном конкретном случае в соответствии с отредактированным вопросом. Но вопрос был отредактирован несколькими людьми после этого, и не так просто узнать, что вы хотите сейчас.
Это описано в
man bash
:источник
Другой способ - использовать
grep
для отображения только последней косой черты в каждой строке и всего, что за ней следует:Объяснение:
-o
велитgrep
показывать только совпадающую часть строки вместо всей строки.Шаблон
/[^/]*$
соответствует косой черте,/
за которой следует любой символ, за исключением косой черты[^/]
любое количество раз*
до конца строки$
.источник
Просто потому, что другие опубликовали более «здравые» ответы, вот несколько глупый:
rev
меняет символы в каждой строке, напримерabcd/ef/g
становитсяg/fe/dcba
. Затемcut
вырезает первый сегмент. Наконец это снова полностью изменено.источник
Классическое решение с
awk
, которое работает/
как разделитель полей для ввода и вывода и устанавливает последнее поле в пустую строку (что на самом деле является «разыменованием»NF
переменной количества полей ):Короче, как отметил Федорки в комментариях:
Вариация этого заключается в том, чтобы поместить путь в
awk
среду исполнения, которая сэкономит на сантехнике, но сделаетawk
часть более многословной:источник
NF--
? Таким образом, вы говорите,print
бла-бла.Добавление к ответу egmont, потому что вопрос был отредактирован ...
Используйте --complement, если вы хотите удалить первое поле с -f1 .
Кроме того, не совсем ясен вопрос о том, что должно происходить с входными данными, не содержащими косую черту. хххх => хххх или хххх => ничего
источник
--complement
опцию, а страница справочника круглая. Дополнение означает дополнение. Я нашел хороший учебник, который охватывает его на yourownlinux.com/2015/05/… Это как-v
вgrep
. Дайте мне все, кроме того, что было подобрано.-f2-
это более простая форма для-f1 --complement
.