Bash - Manipulação Contínua de String

10
#!/bin/bash

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

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

    
por gsklee 08.11.2011 / 14:32

7 respostas

12

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"
    
por 08.11.2011 / 18:24
10

Você não pode aninhar expansões no bash (nem em ksh, ash e outros shells além do zsh). Essa é apenas uma limitação cosmética, já que, conforme você ilustra, você pode atribuir uma expressão intermediária a uma variável temporária. É um pouco irritante para os one-liners, mas nos scripts é indiscutivelmente melhor para a legibilidade.

Você pode evitar usar o utilitário externo basename e usar uma construção de manipulação de string:

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

Aqui, acontece que você pode reescrever 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, deixa você aninhar expansões:

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

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

FILE=${${1:t}/%.jpeg/.jpg}
    
por 09.11.2011 / 01:29
4

Eu preferiria:

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

O segundo parâmetro para basename é um sufixo a ser removido do nome do arquivo (veja man basename )

    
por 25.09.2012 / 23:40
3

Você pode usar um único comando sed da seguinte forma:

FILE=$(sed 's/.*\///;s/\.jpeg$/.jpg/' <<<"$1")
    
por 08.11.2011 / 15:35
2

Incorporando sed , isso deve funcionar:

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.)

    
por 08.11.2011 / 14:59
1

As construções de Bash ${} funcionam com nomes de variáveis , portanto não há como incorporar um comando diretamente. A abordagem do @ sr_ é uma alternativa se você não se importar com o garfo extra.

    
por 08.11.2011 / 15:06
1

A linha

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

pode ser encurtado e tornar-se mais portátil com

FILE=$(basename "${1%.jpeg}.jpg")
    
por 28.11.2011 / 16:46