2013-03-22 26 views
50

Se eseguo il comando cat file | grep pattern, ottengo molte righe di output. Come si concatenano tutte le linee in un'unica riga, sostituendo efficacemente ogni "\n" con "\" " (terminare con " seguito dallo spazio)?Come concatenare più righe di output su una riga?

cat file | grep pattern | xargs sed s/\n/ /g non funziona per me.

+0

possibile duplicato di [SED:? Come posso sostituire una nuova riga (\ n)] (http://stackoverflow.com/questions/1251999/sed-how-can-i-replace-a- newline-n) – ruakh

+0

A proposito: (1) devi mettere il tuo script 'sed' in virgolette singole in modo che Bash non si scherzi con esso (dal momento che' sed s/\ n// g' chiama 'sed' con due argomenti, ovvero 's/n /' e '/ g'); (2) dal momento che si desidera l'output di 'cat file | grep pattern' come * input * per 'sed', non gli * argomenti * per' sed', è necessario eliminare 'xargs'; e (3) non c'è bisogno di 'cat' qui, dato che' grep' può prendere un nome di file come secondo argomento. Quindi, dovresti aver provato 'file di modello grep | sed 's/\ n// g''. (In questo caso non avrebbe funzionato, per ragioni fornite al link sopra, ma ora lo sai per il futuro.) – ruakh

+0

simile a "http://stackoverflow.com/questions/2764051/how-to-join- multiple-lines-of-file-names-in-one-with-custom-delimiter " –

risposta

93

Usa tr '\n' ' ' da tradurre tutti i caratteri di nuova riga di spazi:

$ grep pattern file | tr '\n' ' ' 

Nota: grep legge i file, cat file concatena. Non cat file | grep!

Edit:

tr può gestire solo le traduzioni dei caratteri singoli. Si potrebbe utilizzare awk per modificare il separatore di record output come:

$ grep pattern file | awk '{print}' ORS='" ' 

Questo trasformerebbe:

one 
two 
three 

a:

one" two" three" 
+2

Si finisce con uno spazio indesiderato alla fine con questo approccio. – sorin

+0

È necessario aggiungere "echo" "" alla fine per aggiungere una nuova riga prima del testo del prompt. – nexayq

+1

Funziona bene, tuttavia non voglio che il separatore venga visualizzato all'ultimo ingresso. Ad esempio, per il tuo '" ', si presenta come" uno "due" tre "', tuttavia vorrei mostrarlo come "uno" due "tre". Nota che gli ultimi tre non hanno una parentesi. Qualche idea? – oink

14

Questo potrebbe essere quello che vuoi

cat file | grep pattern | paste -sd' ' 

As per la tua modifica, non sono sicuro di cosa significhi, forse questo?

cat file | grep pattern | paste -sd'~' | sed -e 's/~/" "/g' 

(ciò presuppone che ~ non si verifica in file)

+0

'grep' può leggere il file stesso. – Stephan

+2

@Stephan non c'era bisogno di assumere che 'cat file' fosse effettivamente' cat', o anche un file. (Ho appena lasciato quella parte invariata poiché era irrilevante per la domanda) – sehe

29

uscita Tubazioni per xargs concatenerà ciascuna linea di uscita di una singola linea con spazi:

grep pattern file | xargs 

O qualsiasi comando, per esempio. ls | xargs. Il limite predefinito dell'output xargs è di ~ 4096 caratteri, ma può essere aumentato con es. xargs -s 8192.

+0

'| tr '\ n' '' 'non funzionava per me quando veniva chiamato tramite la funzione' php exec'. Stava ignorando tr, e dando l'ultima partita a Grep. '| xargs' ha funzionato. – Adarsha

+1

Questa soluzione ha anche il vantaggio di "assorbire" gli spazi dall'input. +1 – Rene

+0

Questa dovrebbe essere la risposta accettata. –

21

In bash echo senza virgolette rimuovere i ritorni a capo, tabulazioni e gli spazi multipli

echo $(cat file) 
+1

Qui la risposta è molto sottovalutata, è molto semplice e funziona come un fascino, con una nuova riga finale. – Dangercrow

+0

Ciò è particolarmente accurato se si utilizza 'IFS =" $ (printf '\ n \ t') "' – aggsol

+2

O semplicemente 'echo $ ( Normadize

2

Ecco il metodo utilizza ex redattore:

  • J oin tutto linee e p Rint sullo standard output:

    $ ex +%j +%p -scq! file 
    
  • J oin tutte le linee in-place (nel file):

    $ ex +%j -scwq file 
    

    Nota: questo sarà concatenare tutte le righe all'interno del file it- se stesso!