Suppression de tous les caractères dans .txt qui ne sont pas entourés par des tuyaux (|) OU où la ligne commence par #

J’ai un tas de fichiers .txt qui ressemblent à ceci:

# title: I Got Ssortingpes # artist: Johnny Cash # metre: 4/4 # tonic: Db 0.000000000 silence 0.348299319 A, intro, | Cb:maj | Db:maj | Db:maj |, (guitar) 3.931269841 B, verse, | Db:maj | Db:maj | Ab:maj | Ab:maj |, (voice 8.662993197 | Ab:maj | Ab:maj | Db:maj | Db:maj | # tonic: Eb 78.145873015 D, modulation, | Eb:maj | Eb:maj |, (guitar) 80.474625850 B, verse, | Eb:maj | Eb:maj | Bb:maj | Bb:maj |, (voice 85.104784580 | Bb:maj | Bb:maj | Eb:maj | Eb:maj | 

et j’ai besoin de les convertir en quelque chose comme ça:

  # title: I Got Ssortingpes # artist: Johnny Cash # metre: 4/4 # tonic: Db | Cb:maj | Db:maj | Db:maj | | Db:maj | Db:maj | Ab:maj | Ab:maj | | Ab:maj | Ab:maj | Db:maj | Db:maj | # tonic: Eb | Eb:maj | Eb:maj | | Eb:maj | Eb:maj | Bb:maj | Bb:maj | | Bb:maj | Bb:maj | Eb:maj | Eb:maj | 

Plus précisément, cela signifie:

  • Chaque ligne qui commence par # doit restr exactement la même
  • Chaque ligne vierge (comme la ligne 5 de mon exemple) doit restr là
  • Pour toutes les autres lignes, tous les caractères qui ne sont pas entourés de tubes (|) doivent être supprimés.

J’ai +/- 700 fichiers, dans différents sous-répertoires.

Je pensais à écrire un script sed, mais je n’arrive pas à comprendre comment le faire.

Utiliser sed :

 sed '/^ *#/b;s/^[^|]*//;s/[^|]*$//' filename 

Comment ça marche:

  • Si la ligne commence par un # (avec des espaces optionnels avant le # ), twigz-vous au cycle suivant (c.-à-d. Ne faites rien)
  • Supprimer tout du début de la ligne à |
  • Retirez tout ce qui se trouve à la fin de la ligne avant le |

Si vous utilisez BSD sed, divisez-le:

 sed -e '/^ *#/b' -e 's/^[^|]*//;s/[^|]*$//;' filename