Cadena de varias líneas con espacio adicional (sangría conservada)

Resuelto cizixs asked hace 10 años • 14 respuestas

Quiero escribir algunos textos predefinidos en un archivo con lo siguiente:

text="this is line one\n
this is line two\n
this is line three"

echo -e $text > filename

Espero algo como esto:

this is line one
this is line two
this is line three

Pero tengo esto:

this is line one
 this is line two
 this is line three

Estoy seguro de que no hay espacio después de cada uno \n, pero ¿cómo sale el espacio extra?

cizixs avatar May 29 '14 15:05 cizixs
Aceptado

Heredoc parece más conveniente para este propósito. Se utiliza para enviar múltiples comandos a un programa intérprete de comandos como ex o cat.

cat << EndOfMessage
This is line 1.
This is line 2.
Line 3.
EndOfMessage

La cadena después <<indica dónde detenerse.

Para enviar estas líneas a un archivo, use:

cat > $FILE <<- EOM
Line 1.
Line 2.
EOM

También puedes almacenar estas líneas en una variable:

read -r -d '' VAR << EOM
This is line 1.
This is line 2.
Line 3.
EOM

Esto almacena las líneas de la variable denominada VAR.

Al imprimir, recuerde las comillas que rodean la variable; de ​​lo contrario, no verá los caracteres de nueva línea.

echo "$VAR"

Aún mejor, puedes usar sangría para que se destaque más en tu código. Esta vez simplemente agregue un -después <<para evitar que aparezcan las pestañas.

read -r -d '' VAR <<- EOM
    This is line 1.
    This is line 2.
    Line 3.
EOM

Pero luego debes usar tabulaciones, no espacios, para la sangría en tu código.

alphadog avatar May 29 '2014 09:05 alphadog

Si está intentando convertir la cadena en una variable, otra forma sencilla es algo como esto:

USAGE=$(cat <<-END
    This is line one.
    This is line two.
    This is line three.
END

)

Si sangra su cadena con tabulaciones (es decir, '\t'), se eliminará la sangría. Si sangra con espacios, la sangría se dejará.

NOTAS:

  • Es significativo que el último paréntesis de cierre esté en otra línea . El ENDtexto debe aparecer en una línea por sí solo.
  • Cuando utilice esta variable, para conservar los caracteres no legibles ( \t, \n), debe citarla. Es decir, usar echo "$USAGE"(no echo $USAGE:)
Andrew Miner avatar May 14 '2016 04:05 Andrew Miner

echoagrega espacios entre los argumentos que se le pasan. $textestá sujeto a expansión variable y división de palabras, por lo que su echocomando es equivalente a:

echo -e "this" "is" "line" "one\n" "this" "is" "line" "two\n"  ...

Puedes ver que se agregará un espacio antes de "esto". Puede eliminar los caracteres de nueva línea y poner comillas $textpara conservar las nuevas líneas:

text="this is line one
this is line two
this is line three"

echo "$text" > filename

O podrías usar printf, que es más robusto y portátil que echo:

printf "%s\n" "this is line one" "this is line two" "this is line three" > filename

En bash, que admite la expansión de llaves, incluso podrías hacer:

printf "%s\n" "this is line "{one,two,three} > filename
Josh Jolly avatar May 29 '2014 08:05 Josh Jolly

en un script bash funciona lo siguiente:

#!/bin/sh

text="this is line one\nthis is line two\nthis is line three"
echo -e $text > filename

alternativamente:

text="this is line one
this is line two
this is line three"
echo "$text" > filename

El nombre del archivo cat da:

this is line one
this is line two
this is line three
Chris Maes avatar May 29 '2014 08:05 Chris Maes