¿Cómo recortar espacios en blanco de una variable Bash?

Resuelto too much php asked hace 16 años • 0 respuestas

Tengo un script de shell con este código:

var=`hg st -R "$path"`
if [ -n "$var" ]; then
    echo $var
fi

Pero el código condicional siempre se ejecuta, porque hg stsiempre imprime al menos un carácter de nueva línea.

  • ¿ Existe una forma sencilla de eliminar los espacios en blanco $var(como trim()en PHP )?

o

  • ¿Existe una forma estándar de abordar este problema?

Podría usar sed o AWK , pero me gustaría pensar que existe una solución más elegante para este problema.

too much php avatar Dec 16 '08 04:12 too much php
Aceptado

Una respuesta sencilla es:

echo "   lol  " | xargs

Xargs hará el recorte por usted. Es un comando/programa, sin parámetros, devuelve la cadena recortada, ¡así de fácil!

Nota: esto no elimina todos los espacios internos, por lo que "foo bar"permanece igual; NO se convierte en "foobar". Sin embargo, varios espacios se condensarán en espacios únicos, por lo que "foo bar"se convertirá en "foo bar". Además, no elimina los caracteres de final de línea.

makevoid avatar Oct 19 '2012 11:10 makevoid

Definamos una variable que contenga espacios en blanco iniciales, finales e intermedios:

FOO=' test test test '
echo -e "FOO='${FOO}'"
# > FOO=' test test test '
echo -e "length(FOO)==${#FOO}"
# > length(FOO)==16

Cómo eliminar todos los espacios en blanco (indicados por [:space:]) tr:

FOO=' test test test '
FOO_NO_WHITESPACE="$(echo -e "${FOO}" | tr -d '[:space:]')"
echo -e "FOO_NO_WHITESPACE='${FOO_NO_WHITESPACE}'"
# > FOO_NO_WHITESPACE='testtesttest'
echo -e "length(FOO_NO_WHITESPACE)==${#FOO_NO_WHITESPACE}"
# > length(FOO_NO_WHITESPACE)==12

Cómo eliminar únicamente los espacios en blanco iniciales:

FOO=' test test test '
FOO_NO_LEAD_SPACE="$(echo -e "${FOO}" | sed -e 's/^[[:space:]]*//')"
echo -e "FOO_NO_LEAD_SPACE='${FOO_NO_LEAD_SPACE}'"
# > FOO_NO_LEAD_SPACE='test test test '
echo -e "length(FOO_NO_LEAD_SPACE)==${#FOO_NO_LEAD_SPACE}"
# > length(FOO_NO_LEAD_SPACE)==15

Cómo eliminar solo los espacios en blanco finales:

FOO=' test test test '
FOO_NO_TRAIL_SPACE="$(echo -e "${FOO}" | sed -e 's/[[:space:]]*$//')"
echo -e "FOO_NO_TRAIL_SPACE='${FOO_NO_TRAIL_SPACE}'"
# > FOO_NO_TRAIL_SPACE=' test test test'
echo -e "length(FOO_NO_TRAIL_SPACE)==${#FOO_NO_TRAIL_SPACE}"
# > length(FOO_NO_TRAIL_SPACE)==15

Cómo eliminar los espacios iniciales y finales: encadene la seds:

FOO=' test test test '
FOO_NO_EXTERNAL_SPACE="$(echo -e "${FOO}" | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//')"
echo -e "FOO_NO_EXTERNAL_SPACE='${FOO_NO_EXTERNAL_SPACE}'"
# > FOO_NO_EXTERNAL_SPACE='test test test'
echo -e "length(FOO_NO_EXTERNAL_SPACE)==${#FOO_NO_EXTERNAL_SPACE}"
# > length(FOO_NO_EXTERNAL_SPACE)==14

Alternativamente, si su bash lo admite, puede reemplazarlo echo -e "${FOO}" | sed ...con sed ... <<<${FOO}, así (para los espacios en blanco finales):

FOO_NO_TRAIL_SPACE="$(sed -e 's/[[:space:]]*$//' <<<${FOO})"
MattyV avatar Jul 12 '2010 21:07 MattyV

Una solución que utiliza elementos integrados de Bash llamados comodines :

var="    abc    "
# remove leading whitespace characters
var="${var#"${var%%[![:space:]]*}"}"
# remove trailing whitespace characters
var="${var%"${var##*[![:space:]]}"}"   
printf '%s' "===$var==="

Aquí está lo mismo envuelto en una función:

trim() {
    local var="$*"
    # remove leading whitespace characters
    var="${var#"${var%%[![:space:]]*}"}"
    # remove trailing whitespace characters
    var="${var%"${var##*[![:space:]]}"}"
    printf '%s' "$var"
}

Pasa la cadena a recortar entre comillas, por ejemplo:

trim "   abc   "

Esta solución funciona con shells compatibles con POSIX.

Referencia

  • Eliminar los espacios en blanco iniciales y finales de una variable Bash ( fuente original )
Mateusz Piotrowski avatar Jul 28 '2010 10:07 Mateusz Piotrowski

Para eliminar todos los espacios desde el principio y el final de una cadena (incluidos los caracteres de final de línea):

echo $variable | xargs echo -n

Esto también eliminará los espacios duplicados:

echo "  this string has a lot       of spaces " | xargs echo -n

Produces: 'this string has a lot of spaces'
rkachach avatar Dec 04 '2016 18:12 rkachach