Bash – Manipulación continua de cadenas

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

¿Existe alguna forma de pegar estas dos líneas en una sola línea?

Respuesta

FILE=$(basename "${1/%.jpeg/.jpg}") funcionó para mí.

prueba:

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

contenido del script:

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

Comentarios

  • Dado que las dos líneas son intercambiables, esta solución es hasta ahora la mejor … Si las líneas no son ' t intercambiables sed definitivamente será necesario, supongo.

Respuesta

No puedes anidar expansiones en bash (ni en ksh, ash y otros shells aparte de zsh). Esto es solo una limitación cosmética, ya que como ilustras puedes asignar una expresión intermedia a una variable temporal. Es un poco molesto para las frases breves, pero en los scripts es posiblemente mejor para la legibilidad.

Podrías evitar u cante la utilidad externa basename y use una construcción de manipulación de cadenas en su lugar:

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

Aquí, sucede que puede reescribe tu secuencia de comandos para coloca la sustitución del comando en el exterior . Eso no es un fenómeno general, ni obtienes nada más que una cierta sensación de una sola línea.

Zsh, para bien o para mal, te permite anidar expansiones:

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

O puede usar la construcción incorporada de zsh «en lugar de basename:

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

Respuesta

Yo «iría por:

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

El segundo parámetro del nombre base es un sufijo que se eliminará del nombre del archivo (consulte man basename)

Respuesta

Puede usar un solo comando sed como se muestra a continuación:

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

Respuesta

Incorporando sed, esto debería funcionar:

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

(Esto no responde exactamente a su pregunta porque no puedo; no estoy seguro de si es posible).

Responder

The Bash funcionan con nombres de variables , por lo que no hay forma de incrustar un comando directamente. El enfoque de @sr_ es una alternativa si no le importa la bifurcación adicional.

Respuesta

La línea

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

se puede acortar y hacer más portátil con

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

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *