Bash - Непрерывная манипуляция строк

Ответы:

12

FILE=$(basename "${1/%.jpeg/.jpg}") работал на меня.

контрольная работа:

bash-$ ./test.sh /tmp/foo.jpeg
foo.jpg

содержание скрипта:

bash-$ cat test.sh 
#!/usr/bin/bash

FILE=$(basename "${1/%.jpeg/.jpg}")

echo "$FILE"
Тим Кеннеди
источник
Поскольку эти две линии в некотором роде взаимозаменяемы, это решение пока самое удачное ... Если линии не являются взаимозаменяемыми sed, я определенно буду нуждаться.
Gsklee
11

Вы не можете вкладывать расширения в bash (ни в ksh, ни в пепел, ни в другие оболочки кроме zsh). Это только косметическое ограничение, поскольку, как вы видите, вы можете назначить промежуточное выражение для временной переменной. Это немного раздражает для однострочников, но в сценариях это возможно лучше для удобочитаемости.

Вы можете избежать использования внешней утилиты basenameи использовать вместо этого конструкцию манипуляции со строками:

FILE="${1##*/}"; FILE="${FILE/%.jpeg/.jpg}"

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

Zsh, к лучшему или к худшему, позволяет вам вкладывать расширения:

FILE=${$(basename $1)/%.jpeg/.jpg}    # using basename
FILE=${${1##*/}/%.jpeg/.jpg}          # using string rewriting

Или вы можете использовать встроенную конструкцию zsh вместо basename:

FILE=${${1:t}/%.jpeg/.jpg}
Жиль "ТАК - перестань быть злым"
источник
4

Я бы пошел на:

FILE=$(basename $1 .jpeg).jpg

Второй параметр basename - это суффикс, который необходимо удалить из имени файла (см. man basename)

Chirlo
источник
3

Вы можете использовать одну sedкоманду, как показано ниже:

FILE=$(sed 's/.*\///;s/\.jpeg$/.jpg/' <<<"$1")
enzotib
источник
2

Включение sed, это должно сделать свое дело:

FILE="$(basename "$1" | sed s/\.jpeg$/.jpg/)"

(Это не совсем отвечает на ваш вопрос, потому что я не могу; не уверен, если это возможно.)

Sr-
источник
1

Конструкции Bash ${}работают с именами переменных , поэтому нет способа встроить команду напрямую. Подход @ sr_ является альтернативой, если вы не против дополнительной вилки.

l0b0
источник
1

Линия

FILE=$(basename "${1/%.jpeg/.jpg}")

можно сократить и сделать более портативным с

FILE=$(basename "${1%.jpeg}.jpg")
Питер Джон Аклам
источник