¿Cómo poner un carácter especial de nueva línea en un archivo usando el comando echo y el operador de redirección?


29

Me gustaría crear un archivo utilizando el comando echo y el operador de redireccionamiento, el archivo debe estar formado por unas pocas líneas.

Traté de incluir una nueva línea con "\ n" dentro de la cadena:

echo "first line\nsecond line\nthirdline\n" > foo

pero de esta manera no se crea ningún archivo con tres líneas, sino un archivo con solo una línea y el contenido literal de la cadena.

¿Cómo puedo crear usando solo este comando un archivo con varias líneas?


Respuestas:


30

Solicitaste usar una sintaxis con el echocomando:

echo $'first line\nsecond line\nthirdline' > foo

(Pero considere también la otra respuesta que obtuvo).

La $'...'construcción expande secuencias de escape ANSI incrustadas.


1
Tenga en cuenta que esto no es POSIX, si está disponible depende en gran medida de qué shell está utilizando.
Chris Down

1
Encontrará esa construcción en los shells prominentes (al menos), ksh, bash, zsh (y tal vez otros).
Janis

1
@ChrisDown, todavía no es POSIX, pero está programado para su inclusión en el número 8. ksh93, bash, zsh, mksh, FreeBSD sh lo admiten.
Stéphane Chazelas

24

Lo que echo con los escapes de caracteres es la implementación definida En muchas implementaciones de echo (incluidas las más modernas), la cadena pasada no se examina en absoluto para detectar escapes de forma predeterminada.

Con el eco proporcionado por GNU bash (como incorporado) y algunas otras variantes de eco, puede hacer algo como lo siguiente:

echo -en 'first line\nsecond line\nthird line\n' > file

Sin embargo, realmente suena como lo desea printf, lo que es más legible para mi ojo y más portátil también (tiene esta característica definida por POSIX):

printf '%s\n' 'first line' 'second line' 'third line' > file

También podría considerar usar un documento aquí :

cat > file << 'EOF'
first line
second line
third line
EOF

probé su gato> archivo << 'EOF' en el shell, y cuando presioné enter, obtuve este mensaje> con forma con cada línea, pero no pude salir de él incluso presionando ctrl + x o ctrl + z
Abdul Al Hazred

Tienes que escribir EOF solo en una línea de entrada ...
Rmano

2
@mikeserv ¿Estás siendo gracioso o serio?
Mateo leyó el

1
@AbdulAlHazred como indica el enlace en la respuesta, se llama "documento aquí" y es muy común. Wikipedia es bueno sobre este tema: en.wikipedia.org/wiki/Here_document .
dave_thompson_085

1
Esto funcionó para mi Mac OSX (específicamente echo -en 'text..', mientras que la respuesta aceptada no reconoció mi carácter de nueva línea ( \n), lo echo -enhizo.
Benjaminmgross

4

Aquí hay otras formas de crear un archivo de varias líneas con el echocomando:

echo "first line"  >  foo
echo "second line" >> foo
echo "third line"  >> foo

donde el segundo y el tercer comando usan el >>operador de redirección, lo que hace que la salida del comando se agregue (agregue) al archivo (que ya debería existir, en este punto).

O

(echo "first line"; echo "second line"; echo "third line") > foo

donde los paréntesis agrupan los echocomandos en un subproceso, que se ve y actúa como cualquier programa único que genera múltiples líneas (como ls, por ejemplo).

Una variación sutil de lo anterior es

{ echo "first line"; echo "second line"; echo "third line";} > foo

Esto es un poco más eficiente que la segunda respuesta, ya que no crea un subproceso. Sin embargo, la sintaxis es un poco más complicada: tenga en cuenta que debe tener un espacio después del {y un punto y coma antes del }.

Consulte ¿Cuáles son los operadores de control y redirección de shell? para más información.


2

Para dar otra opción más, puede presionar Enter (es decir, una nueva línea literal):

$ echo "the rain in spain
> falls mainly on the plain" > foo

Tenga en cuenta que no escribe el >al principio de la segunda línea. Ese es el indicador del shell secundario $PS2, que el shell imprime cuando escribe un comando incompleto (p. Ej., En este caso, un comando con un carácter de comillas incomparable).


0

POSIX 7 dice que no puedes

http://pubs.opengroup.org/onlinepubs/9699919799/utilities/echo.html

-e no está definido y las barras diagonales inversas están definidas en la implementación:

Si el primer operando es -n, o si alguno de los operandos contiene un carácter <backslash>, los resultados están definidos por la implementación.

a menos que tenga una extensión XSI opcional.

Entonces use printfen su lugar:

el operando de formato se utilizará como la cadena de formato descrita en la notación de formato de archivo XBD [...]

la notación de formato de archivo :

\ n <línea nueva> Mueva la posición de impresión al comienzo de la línea siguiente.

También tenga en cuenta que Ubuntu 15.10 y la mayoría de las distribuciones implementan echotanto como:

  • un Bash incorporado: help echo
  • un ejecutable independiente: which echo

lo que puede generar cierta confusión.


Habrá una función echoincorporada en cada shell disponible en el sistema. En Ubuntu / bin / sh suele ser dash, bash también viene por defecto. zsh, rc, mksh, yash, csh, tcsh, ksh93 ... todos tendrán su propio eco con un comportamiento diferente. Tenga en cuenta que which echono le dará la ruta del eco del sistema en todos los shells.
Stéphane Chazelas

@ StéphaneChazelas "cuyo eco no le dará la ruta del eco del sistema en todos los shells". Que no sabía, ¿qué más podría dar?
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Prueba en tcsh o zsh. whichOriginalmente (en los años 80) era un script csh solo para usuarios csh (cargó los alias de ~ / .cshrc) y todavía está en algunos sistemas. whiches un incorporado en zsh y tcsh.
Stéphane Chazelas
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.