sed: correspond à deux lignes

11

J'ai un fichier texte, où les enregistrements sont divisés sur deux lignes. Je voudrais les mettre sur une seule ligne. Les enregistrements ressemblent à ceci:

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

J'aimerais obtenir ce qui suit:

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

J'ai essayé avec sed, mais je n'arrive pas à faire correspondre deux lignes. Y a-t-il une astuce sedou un meilleur outil?

Martin Vegter
la source
Il semble moins que vous souhaitiez faire correspondre deux lignes et plus vous souhaitiez rejoindre la ligne après avoir trouvé une correspondance. Oui?
kurtm

Réponses:

13
sed 'N;s/\n/ /'
  • N joint la prochaine ligne d'entrée à l'espace de motif
  • s/\n/ / remplace la nouvelle ligne qui sépare les lignes par un espace.

ou:

sed -n 'N;s/\n/ /;/regex/p'
  • -n désactive l'impression automatique de l'espace de motif comme dernière commande
  • /regex/p imprime des lignes correspondant à l'expression régulière

Utilisez le gmodificateur pour les substitutions au cas où vous joigniez plus de deux lignes, par exemple N;N;N;s/\n/ /g.

peterph
la source
point à retenir: sed travaille sur les lignes! j'ai passé des heures à essayer de me rendre sed 's/>\n</>,</'au travail jusqu'à ce que je réalise que sed travaille sur les lignes à la fois. une recherche rapide de duckduckgo et @peterph m'ont permis de garder le reste de mes cheveux
north-bradley
6

Il semble que les apt-getlignes aient un espace précédent. En disant:

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

devrait produire le résultat souhaité.

Alternativement, vous pouvez également utiliser paste:

paste -d' ' - - < inputfile
devnull
la source