Como fazer mais de uma substring substitua de uma só vez no bash?

4

Eu tenho um diretório contém arquivos de imagem que devem ser ecoados no bash. Durante o eco, quero substituir o nome do arquivo e a extensão no comando de linha única.

Arquivos de exemplo:

images/file_name_1.jpg
images/file_name_2.jpg

Normalmente, posso fazer uma substituição única assim:

for i in images/*; do echo ${i/file/image}; done

E a saída se torna como:

images/image_name_1.jpg
images/image_name_2.jpg

Como posso mantê-lo em loop e substituir a string "jpg" por "png" também? É apenas uma instância, eu poderia substituir o ponto por vírgula, etc.

Quando eu tento isso:

for i in images/*; do echo ${{i/jpg/png}/file/image}; done

Não funciona. Não consigo encontrar outra solução ou ideia. Isso é possível -se assim, como?

    
por kubilay 18.04.2014 / 12:34

3 respostas

3

A abordagem simples seria atribuir o resultado a uma variável e depois trabalhar com essa variável. Exemplo:

for filename in images/*
do
    echo "filename is now $filename"
    filename=${filename/jpg/png}; echo "filename is now $filename"
    filename=${filename/file/image}; echo "filename is now $filename"
    echo "final filename is ${filename}"
done
    
por 18.04.2014 / 12:48
1

Você pode atribuir a substituição anterior a uma variável e executar substituir essa variável

for i in images/*
do
    j=${i/jpg/png}
    echo ${j/file/image}
done
    
por 18.04.2014 / 12:47
0

para alterar qualquer string :

$ echo "images/file_name_1.jpg" | perl -pE 's/file/image/;s/jpg$/png/;'
images/image_name_1.png

um atalho para renomear (que pode ser o objetivo final:

$ rename 's/file/image/;s/jpg$/png/;' "$i"
    
por 18.04.2014 / 12:50