Reemplazar comillas simples para cadenas divididas por espacios en blanco de la variable

Reemplazar comillas simples para cadenas divididas por espacios en blanco de la variable

Estoy escribiendo un script bash donde leo una variable a través de readestas dos cadenas:

log.*.console.log log.*.log

Están separados por el espacio.

¿Cómo puedo reescribir las cadenas que la salida de la variable para el siguiente programa llamado en el script tendrá en esta forma?'log.*.console.log' 'log.*.log'

Estaba probando sed y awk pero de alguna manera sin éxito.

El guión completo:

#!/bin/bash
if [ -z "$*" ] ; then
echo "USAGE: ./some text"
exit 1

else

echo "some text"
read varlogname

i=1
for file in $@
do
echo "Doing" $file
GTAR=$(gtar -xvf $file --wildcards --ignore-case --no-anchored "$varlogname")

for file in ${GTAR[*]}
do
mv $file $file"."${i}
i=$((i+1))
done
done
echo "Files extracted."
fi
exit 0

Respuesta1

No creo que quieras poner comillas simples a gtar. En un comando como somecmd 'foo bar' 'files*.log', el shell manejará las comillas, le indicará que no trate los caracteres especiales de manera especial y pasará somecmdlos argumentos foo bary files*.log. Los programas Unix no obtienen la línea de comandos como una cadena, sino como una serie de cadenas de argumentos; es el shell el que divide la línea de comandos en cadenas.

Si desea readvarios valores en Bash, puede usar read -a arrayy luego entregar la matriz al comando.

  -a array  assign the words read to sequential indices of the array
            variable ARRAY, starting at zero

es decir

read -a filenames
gtar "${filenames[@]}"

La indexación de la matriz con [@](entre comillas) se expande a los miembros de la matriz como palabras separadas, que es lo que desea.

Además, tienes for file in ${GTAR[*]}. Parece acceder GTARcomo una matriz, pero no lo es, simplemente le ha asignado la salida del gtarcomando, como una cadena. En este caso ${GTAR[*]}es lo mismo que $GTAR. Dado que la expansión no está entre comillas, la cadena se divide en palabras en este punto, lo que de forma predeterminada se divide en espacios en blanco. Pero, después de eso, las palabras sontambiéntomados como globos de nombres de archivos y expandidos a nombres de archivos coincidentes.

Siempre y cuando los nombres de sus archivos no contengan espacios en blanco o caracteres globales ( *?[], esto está bien. Pero en general, no es algo que desee hacer.

Para matrices adecuadas, probablemente siempre quieras usar "${array[@]}"en lugar de [*].

Ver:División de palabras,¿Por qué mi script de shell se atasca con espacios en blanco u otros caracteres especiales?ymatrices

información relacionada