1

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

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

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

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

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

cut=$(tmp=${path%/*}; echo ${tmp##*/})

4 ответа4

2

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

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

Выход:

dir2
2

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

IFS=/ read -a array <<<'/dir0/dir1/dir2/filename.ext'
echo ${array[ $(( ${#array[@]}-2 )) ]}
dir2
1

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

path=/dir0/dir1/dir2/filename.ext
dir=${path%/*}
lastdir=${dir##*/}

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

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

cut=${path%/*}; cut=${cut##*/}

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

1

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

echo "/dir0/dir1/dir2/filename.ext" | awk -F'/' '{print $(NF-1)}'

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

dir2

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .