Bash – Manipulação contínua de strings

#!/bin/bash FILE="$(basename "$1")" FILE="${FILE/%.jpeg/.jpg}" 

Existe alguma maneira de colar essas duas linhas em uma linha?

Resposta

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

teste:

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

conteúdo do script:

bash-$ cat test.sh #!/usr/bin/bash FILE=$(basename "${1/%.jpeg/.jpg}") echo "$FILE" 

Comentários

  • Como as duas linhas são meio que intercambiáveis, esta solução é até agora a mais simples … Se as linhas não forem ' t intercambiáveis sed será definitivamente necessário, eu acho.

Resposta

Você não pode” aninhar expansões em bash (nem em ksh, ash e outros shells além de zsh). Esta é apenas uma limitação cosmética, uma vez que, como você ilustra, pode atribuir uma expressão intermediária a uma variável temporária. É um pouco chato para uma linha, mas em scripts, é indiscutivelmente melhor para legibilidade.

Você poderia evitar cante o utilitário externo basename e use uma construção de manipulação de string:

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

Aqui, acontece que você pode reescreva seu script para colocar a substituição do comando do lado de fora . Isso não é um fenômeno geral, nem você ganha nada além de um certo sentimento de uma linha.

Zsh, para melhor ou para pior, permite que você aninhe expansões:

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

Ou você pode usar a construção interna do zsh “em vez de basename:

FILE=${${1:t}/%.jpeg/.jpg} 

Resposta

Eu “daria para:

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

O segundo parâmetro para o nome de base é um sufixo a ser removido do nome do arquivo (ver man basename)

Resposta

Você pode usar um único comando sed como o seguinte:

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

Resposta

Incorporando sed, isso deve resolver:

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

(Isso não responde exatamente à sua pergunta porque não posso; não tenho certeza se é possível.)

Resposta

O Bash funcionam com nomes de variáveis , então não há como incorporar um comando diretamente. A abordagem de @sr_ “é uma alternativa se você não se importar com a bifurcação extra.

Resposta

A linha

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

pode ser reduzido e tornado mais portátil com

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

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *