Risposta veloce
sed ':a;N;$!ba;s/\n/ /g' file
- : a crea un'etichetta 'a'
- N aggiunge la riga successiva allo spazio del motivo
- $! se non l'ultima riga , ba branch (vai a) etichetta 'a'
- s sostituire , / \ n / regex per la nuova riga , / / con uno spazio , / g corrispondenza globale (quante più volte possibile)
sed passerà attraverso i passaggi da 1 a 3 fino a raggiungere l'ultima riga, facendo in modo che tutte le linee si adattino allo spazio del modello in cui sed sostituirà tutti i \ n caratteri
alternative
Tutte le alternative, a differenza di sed , non dovranno raggiungere l'ultima riga per iniziare il processo
con bash , lento
while read line; do printf "%s" "$line "; done < file
con velocità perl , sed- like
perl -p -e 's/\n/ /' file
con tr , più veloce di sed , può essere sostituito da un solo carattere
tr '\n' ' ' < file
con incolla , velocità tr- like, può sostituire solo con un carattere
paste -s -d ' ' file
con awk , tr -come velocità
awk 1 ORS=' ' file
Un'altra alternativa come "echo $ (<file)" è lenta, funziona solo su file di piccole dimensioni e deve elaborare l'intero file per iniziare il processo.
5.10. Perché non riesco ad abbinare o cancellare una nuova riga usando la
sequenza di escape \ n ? Perché non riesco ad abbinare 2 o più righe usando \ n?
La \ n non corrisponderà mai alla nuova riga alla fine della riga poiché la
nuova riga viene sempre rimossa prima che la riga venga posizionata nello
spazio del motivo. Per ottenere 2 o più linee nello spazio del pattern, usa
il comando 'N' o qualcosa di simile (come 'H; ...; g;').
Sed funziona in questo modo: sed legge una riga alla volta, taglia la
nuova riga finale, inserisce ciò che rimane nello spazio del modello in cui
lo script sed può indirizzarlo o modificarlo e quando
viene stampato lo spazio del modello , aggiunge una nuova riga allo stdout (o in un file). Se lo
spazio del motivo viene completamente o parzialmente cancellato con 'd' o 'D', in questi casi la
newline non viene aggiunta. Quindi, gli script piacciono
sed 's/\n//' file # to delete newlines from each line
sed 's/\n/foo\n/' file # to add a word to the end of each line
non funzionerà MAI, perché la nuova riga finale viene rimossa prima che
la linea venga inserita nello spazio modello. Per eseguire le attività di cui sopra,
utilizzare invece uno di questi script:
tr -d '\n' < file # use tr to delete newlines
sed ':a;N;$!ba;s/\n//g' file # GNU sed to delete newlines
sed 's/$/ foo/' file # add "foo" to end of each line
Poiché versioni di sed diverse da GNU sed hanno limiti alle dimensioni del
pattern buffer, l'utilità 'tr' di Unix è da preferire qui.
Se l'ultima riga del file contiene una nuova riga, GNU sed aggiungerà
quella nuova riga all'output ma eliminerà tutte le altre, mentre tr
eliminerà tutte le nuove righe.
Per abbinare un blocco di due o più linee, ci sono 3 scelte di base:
(1) usa il comando 'N' per aggiungere la linea successiva allo spazio del modello;
(2) utilizzare il comando 'H' almeno due volte per aggiungere la linea corrente
allo spazio di attesa, quindi recuperare le linee dallo spazio di attesa
con x, g o G; oppure (3) utilizzare gli intervalli di indirizzi (vedere la sezione 3.3, sopra)
per far corrispondere le linee tra due indirizzi specificati.
Le scelte (1) e (2) inseriranno un \ n nello spazio del motivo, dove
può essere indirizzato come desiderato ('s / ABC \ nXYZ / alfabeto / g'). Un esempio
dell'uso di 'N' per cancellare un blocco di linee appare nella sezione 4.13
("Come posso cancellare un blocco di specifiche linee consecutive?"). Questo
esempio può essere modificato cambiando il comando delete in
qualcos'altro, come 'p' (stampa), 'i' (inserisci), 'c' (cambia), 'a' (aggiungi)
o 's' (sostituisci) .
Choice (3) non sarà mettere un \ n nello spazio modello, ma non
corrispondono a un blocco di righe consecutive, quindi potrebbe essere che non hai
nemmeno bisogno del \ n per trovare quello che stai cercando. Poiché GNU sed
versione 3.02.80 ora supporta questa sintassi:
sed '/start/,+4d' # to delete "start" plus the next 4 lines,
oltre ai tradizionali indirizzi "/ da qui /, / a là / {...}"
, potrebbe essere possibile evitare l'uso di \ n del tutto.
tr
è solo lo strumento giusto per il lavoro se si sostituisce un singolo carattere per un singolo carattere, mentre l'esempio sopra mostra sostituire newline con uno spazio .. Quindi nell'esempio sopra, tr potrebbe funzionare .. Ma sarebbe limitare in seguito.