¿Cómo recortar espacios en blanco de una variable Bash?
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 st
siempre imprime al menos un carácter de nueva línea.
- ¿ Existe una forma sencilla de eliminar los espacios en blanco
$var
(comotrim()
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.
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.
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 sed
s:
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})"
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 )
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'