Cadena de varias líneas con espacio adicional (sangría conservada)
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?
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.
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
END
texto 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, usarecho "$USAGE"
(noecho $USAGE
:)
echo
agrega espacios entre los argumentos que se le pasan. $text
está sujeto a expansión variable y división de palabras, por lo que su echo
comando 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 $text
para 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
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