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


11
#!/bin/bash

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

Есть ли способ склеить эти две линии в одну линию?

Ответы:


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)


3

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

FILE=$(sed 's/.*\///;s/\.jpeg$/.jpg/' <<<"$1")

2

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

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

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


1

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


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.