Как получить строку между двумя последними символами "/"

1389
Nisba

Я использую Bash. У меня есть несколько путей, как /dir0/dir1/dir2/filename.extи я хочу извлечь строку dir2в Bash. Вы можете предположить, что слово, которое я хочу извлечь, находится между двумя последними /символами.

Я пытаюсь комбинировать ##и %с плохими результатами.

То, что я пытался и не работает, это cut=${$##*/}.

Как я могу это сделать?

Решено, но в поисках альтернатив . Мое решение заключается в следующем:

cut=$(tmp=$; echo $)

1
`basename $ (dirname /dir0/dir1/dir2/filename.ext)` или `echo /dir0/dir1/dir2/filename.ext | awk -F '/' '' ` Cyrus 6 лет назад 1

4 ответа на вопрос

2
Cyrus

С bash и регулярным выражением:

s="/dir0/dir1/dir2/filename.ext" [[ $s =~ ([^/]*)/[^/]*$ ]] && echo "$" 

Выход:

dir2 
2
Paulo

Еще один способ с Bash (также два шага).

IFS=/ read -a array <<<'/dir0/dir1/dir2/filename.ext' echo $-2 )) ]} dir2 
что такое << <<< `? Nisba 6 лет назад 0
@Nisba: это [здесь строка] (https://en.wikipedia.org/wiki/Here_document#Here_strings). Cyrus 6 лет назад 0
1
AFH

Вы должны сделать анализ поэтапно:

path=/dir0/dir1/dir2/filename.ext dir=$ lastdir=$ 

Пытаясь объединить обе операции синтаксического анализа, вы пытались использовать строку вместо переменной во втором расширении: это не поддерживается.

Обратите внимание, что вы можете использовать то же имя переменной для обоих dirи lastdir, например: -

cut=$; cut=$ 

Вы не сказали, что ваша оболочка есть bash, но я предположил это из вашего примера кода.

1
Vipul

Решил это с помощью awk:

echo "/dir0/dir1/dir2/filename.ext" | awk -F'/' '' 

Выход выше будет:

dir2 

Похожие вопросы