sed: abbina due righe


11

Ho un file di testo, in cui i record sono divisi su due righe. Vorrei metterli su una linea. I record hanno un aspetto simile al seguente:

2013-07-29
 apt-get install git
2013-07-29
 apt-get install rsync
2013-07-31
 apt-get install nmap
2013-08-02
 apt-get install cifs-utils
2013-08-05
 apt-get install telnet

Vorrei ottenere quanto segue:

2013-07-29 apt-get install git
2013-07-29 apt-get install rsync
2013-07-31 apt-get install nmap
2013-08-02 apt-get install cifs-utils
2013-08-05 apt-get install telnet

Ho provato con sed, ma non riesco a trovare due righe. C'è qualche trucco sedo c'è uno strumento migliore?


Sembra meno che tu voglia abbinare due linee, e più vuoi unirti alla linea dopo aver trovato una corrispondenza. Sì?
Kurtm,

Risposte:


13
sed 'N;s/\n/ /'
  • N unisce la riga di input successiva allo spazio del pattern
  • s/\n/ / sostituisce la nuova linea che separa le linee con uno spazio.

o:

sed -n 'N;s/\n/ /;/regex/p'
  • -n disabilita la stampa automatica dello spazio motivo come ultimo comando
  • /regex/p stampa le linee corrispondenti a regex

Utilizzare il gmodificatore per le sostituzioni nel caso in cui si stiano unendo più di due righe, ad es N;N;N;s/\n/ /g.


punto da ricordare: sed lavora su linee! ho passato anni cercando di mettermi sed 's/>\n</>,</'al lavoro fino a quando mi sono reso conto che sed lavora in linea alla volta. una rapida ricerca di duckduckgo e @peterph mi hanno permesso di mantenere il resto dei miei capelli
north-bradley

6

Sembra che le apt-getlinee abbiano uno spazio bianco precedente. Detto:

sed -e :a -e '$!N;s/\n / /;ta' -e 'P;D' inputfile

dovrebbe produrre il risultato desiderato.

In alternativa, puoi anche utilizzare paste:

paste -d' ' - - < inputfile
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.