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
Estoy esperando 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?
text="this is line one\nthis is line two\nthis is line three"
en la misma línea ...? (sin entrar)\n
en cada línea, ya ha llegado a la nueva línea para pasar a la nueva línea\n
. Entonces, ¿por qué pones la siguiente línea en una nueva línea? Simplementetext="this is line one\nthis is line two\nthis is line three"
\n
al final de cada línea, la salida se ejecuta en una sola línea."$text"
de la línea de eco es crucial. Sin ellos, ninguna de las líneas nuevas (tanto literales como '\ n') funciona. Con ellos, todos lo hacen.Respuestas:
Heredoc suena más conveniente para este propósito. Se utiliza para enviar múltiples comandos a un programa de intérprete de comandos como ex o cat
La cadena después
<<
indica dónde detenerse.Para enviar estas líneas a un archivo, use:
También puede almacenar estas líneas en una variable:
Esto almacena las líneas a la variable nombrada
VAR
.Al imprimir, recuerde las comillas alrededor de la variable; de lo contrario, no verá los caracteres de nueva línea.
Aún mejor, puede usar la sangría para que se destaque más en su código. Esta vez solo agrega un
-
after<<
para detener la aparición de las pestañas.Pero luego debe usar pestañas, no espacios, para la sangría en su código.
fuente
-d
opción enread -r -d '' VARIABLE <<- EOM
no funcionó para mí.Si está tratando de convertir la cadena en una variable, otra forma fácil es algo como esto:
Si sangra su cadena con pestañas (es decir, '\ t'), la sangría se eliminará. Si sangra con espacios, la sangría se dejará adentro.
NOTA: es significativo que el último paréntesis de cierre es en otra línea. El
END
texto debe aparecer en una línea por sí mismo.fuente
)
en la misma línea. Creo que es porque lo que se interpone$(
y)
se ejecutará en su propio universo, y el comando real no verá ')' de todos modos. Me pregunto si también funciona para otros.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 suecho
comando es equivalente a:Puede ver que se agregará un espacio antes de "esto". Puede eliminar los caracteres de nueva línea y citar
$text
para preservar las nuevas líneas:O podría usar
printf
, que es más robusto y portátil queecho
:En
bash
, que admite la expansión de llaves, incluso podría hacer:fuente
en un script bash, los siguientes trabajos:
alternativamente:
nombre de archivo del gato da:
fuente
-e
opción paraecho
. Inténtalo de nuevo.He encontrado más soluciones ya que quería tener cada línea correctamente sangrada:
Puedes usar
echo
:No funciona si coloca
"\n"
justo antes\
al final de una línea.Alternativamente, puede usar
printf
para una mejor portabilidad (tuve muchos problemas conecho
):Otra solución más podría ser:
o
Otra solución se logra mezclando
printf
ysed
.No es fácil refactorizar el código con este formato mientras codifica el nivel de sangría en el código.
Es posible utilizar una función auxiliar y algunos trucos de sustitución de variables:
fuente
La siguiente es mi forma preferida de asignar una cadena de varias líneas a una variable (creo que se ve bien).
El número de guiones bajos es el mismo (aquí 80) en ambos casos.
fuente
Solo por mencionar una concatenación simple de una línea, ya que puede ser útil a veces.
Obtendrás algo como esto
Todos los espacios en blanco iniciales y finales se conservarán correctamente para
fuente
Hay muchas formas de hacerlo. Para mí, conectar la cuerda sangrada en sed funciona muy bien.
Esta respuesta se basó en la respuesta de Mateusz Piotrowski pero refinada un poco.
fuente
funcionará si lo pones de la siguiente manera:
fuente