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?


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.


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.