Обрезка строки в Bash

Список установленных пакетов и дотфайлов в вашем доме - хорошая ставка.

Управление dotfiles - это своего рода искусство, check

https://dotfiles.github.io/

3
29.08.2016, 15:16
1 ответ

Если у вас есть фиксированное расширение, POSIX basename поддерживает именно ту обрезку, которую вы пытаетесь сделать:

basename "$var" .ext

Если нет, расширение zsh поддерживает именно то, что вы пытаетесь:

Если выражение параметра типа $ {...} или подстановка команды типа $ (...) используется вместо имени выше, оно сначала раскрывается, а результат используется так, как если бы он были значением имени. Таким образом, можно выполнять вложенные операции: $ {$ {foo # head}% tail} заменяет значение $ foo удаленными "head" и "tail".

Итак, zsh

echo ${${var##*/}%.*}

сделает то, что вы ожидали.


Если вы привержены Bash и хотите сохранить строки, вы можете использовать sed:

sed -e 's/\.[^.]*$//' <<<"${var##*/}"

Это просто замена регулярным выражением всего, что находится после последнего . ни с чем, после потери префикса так же, как и сейчас. Однако я не вижу такой экономии памяти по сравнению с двухстрочной версией, и, вероятно, это тоже менее понятно.

Обратите внимание, что нет причин, по которым вы не можете использовать одну и ту же переменную прямо в процессе:

var2=${var##*/}
var2=${var2%.*}

Расширение происходит до присваивания, так что это безопасно. Если вас беспокоит, что действительно длинное имя файла сохраняется дважды, этого не произойдет сейчас, но я не думаю, что это реальная проблема.

5
27.01.2020, 21:15

Теги

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