Come inserire un carattere speciale newline in un file usando il comando echo e l'operatore di reindirizzamento?


29

Vorrei creare un file usando il comando echo e l'operatore di reindirizzamento, il file dovrebbe essere composto da poche righe.

Ho provato a includere una riga da "\ n" all'interno della stringa:

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

ma in questo modo non viene creato alcun file con tre righe ma un file con una sola riga e il contenuto testuale della stringa.

Come posso creare usando solo questo comando un file con più righe?


Risposte:


30

Hai chiesto l'utilizzo di una sintassi con il echocomando:

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

(Ma considera anche l'altra risposta che hai ricevuto.)

Il $'...'costrutto espande le sequenze di escape ANSI integrate.


1
Si noti che questo non è POSIX, se è disponibile dipende in gran parte dalla shell che si sta utilizzando.
Chris Down,

1
Trovi quel costrutto nelle conchiglie prominenti (almeno), ksh, bash, zsh (e forse altre).
Janis,

1
@ChrisDown, non è ancora POSIX, ma è programmato per l'inclusione nel numero 8. ksh93, bash, zsh, mksh, FreeBSD sh lo supportano.
Stéphane Chazelas,

24

Ciò che l'eco fa con le escape di caratteri è l'implementazione definita. In molte implementazioni di eco (comprese quelle più moderne), la stringa passata non viene esaminata per impostazione predefinita per gli escape.

Con l'eco fornito da GNU bash (come incorporato) e alcune altre varianti di eco, puoi fare qualcosa del tipo:

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

Tuttavia, sembra davvero che tu voglia printf, il che è più leggibile per me e anche più portatile (ha questa funzione definita da POSIX):

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

Puoi anche prendere in considerazione l'utilizzo di un documento qui :

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

ho provato il tuo gatto> file << 'EOF' nella shell, e quando ho premuto invio, ho ricevuto questo> prompt a forma di con ogni riga, ma non sono riuscito a uscirne nemmeno premendo Ctrl + X o Ctrl + Z
Abdul Al Hazred,

Devi digitare EOF da solo in una riga di input ...
Rmano

2
@mikeserv Sei faceto o serio?
Matteo Leggi il

1
@AbdulAlHazred come indica il link nella risposta, si chiama "qui documento" ed è molto comune. Wikipedia è bravo su questo argomento: en.wikipedia.org/wiki/Here_document .
dave_thompson_085

1
Questo ha funzionato per il mio Mac OSX (in particolare echo -en 'text..', mentre la risposta accettata non ha riconosciuto il mio carattere newline ( \n), lo ha echo -enfatto.
benjaminmgross,

4

Ecco alcuni altri modi per creare un file multilinea usando il echocomando:

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

dove il secondo e il terzo comando usano l' >>operatore di reindirizzamento, il che fa sì che l'output del comando venga aggiunto (aggiunto) al file (che dovrebbe già esistere, a questo punto).

O

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

dove le parentesi raggruppano i echocomandi in un unico processo secondario, che ha l'aspetto e il comportamento di ogni singolo programma che genera più righe (come ls, ad esempio).

Una sottile variazione di quanto sopra è

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

Questo è leggermente più efficiente della seconda risposta in quanto non crea un processo secondario. Tuttavia, la sintassi è leggermente più complicata: nota che devi avere uno spazio dopo il {punto e un punto e virgola prima del }.

Vedi Quali sono gli operatori di controllo e reindirizzamento della shell? per maggiori informazioni.


2

Per dare ancora un'altra opzione, puoi semplicemente premere Enter (cioè una nuova riga letterale):

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

Si noti che non si digita >all'inizio della seconda riga. Questo è il prompt secondario della shell $PS2, che la shell stampa quando si digita un comando incompleto (ad esempio, in questo caso, un comando con un carattere di virgolette senza pari).


0

POSIX 7 dice che non puoi

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

-e non è definito e le barre rovesciate sono definite dall'implementazione:

Se il primo operando è -n o se uno qualsiasi degli operandi contiene un carattere <barra rovesciata>, i risultati sono definiti dall'implementazione.

a meno che tu non abbia un'estensione XSI opzionale.

Quindi usa printfinvece:

l'operando di formato deve essere usato come stringa di formato descritta nella notazione del formato di file XBD [...]

la notazione sul formato del file :

\ n <nuova> Sposta la posizione di stampa all'inizio della riga successiva.

Inoltre, tieni presente che Ubuntu 15.10 e la maggior parte delle distribuzioni implementano echoentrambi come:

  • un Bash integrato: help echo
  • un eseguibile autonomo: which echo

che può creare confusione.


Ci sarà un echobuilt-in in ogni shell disponibile sul sistema. Su Ubuntu / bin / sh è di solito trattino, anche bash arriva di default. zsh, rc, mksh, yash, csh, tcsh, ksh93 ... avranno tutti la propria eco con comportamenti diversi. Nota che which echonon ti darà il percorso dell'eco di sistema in tutte le shell.
Stéphane Chazelas,

@ StéphaneChazelas "che l'eco non ti darà il percorso dell'eco del sistema in tutte le shell." Che non sapevo, cos'altro poteva dare?
Ciro Santilli 22 改造 中心 法轮功 六四 事件 il

Prova in tcsh o zsh. whichera originariamente (negli anni '80) uno script csh solo per utenti csh (caricava gli alias da ~ / .cshrc) ed è ancora su alcuni sistemi. whichè incorporato in zsh e tcsh.
Stéphane Chazelas,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.