Parser un fichier texte

Tags: #<Tag:0x00007f509b93e570>

Bonjour bonjour,

Je m’explique, j’ai un fichier texte de ce type :

blablablablablablablablabla
{blablablablablablablablabla}
{blablablablablablablablabla}
blablablablablablablablabla
{blablablablablablablablabla}
...

Le fichier change et s’allonger avec plus ou moins de lignes mais il respectera toujours ce format. J’essaye de faire un script qui permettrait de venir récupérer les données dans les accolades et les mettre dans un autres fichier txt.

J’ai essayé avec awk mais je n’arrive pas à trouver les bonnes commandes et c’est galère sniff.

Quelqu’un aurait une solution pour m’aider ?

Merci d’avance.

Bonjour

Donc, commençons par définir le format de ce fichier.
Je vais appeler ce fichier : fichierSource.txt

Si je me base sur le contenu du fichier que tu nous donnes en exemple :

  • il y aura dans ton fichier des lignes (contenant une suite de 27 caractères ASCII) mais qui ne contiendra aucun caractère de séparation ni de ponctuation .
  • et certaines de ces lignes seront encadrées par les caractères { }
  • et d’autres lignes du même format seront ajoutées dans ce fichier.

Est-ce bien ça ?

Sinon, il faudra nous dire quelles sont les contraintes manquantes.


Je vais appeler l’autres fichier txt : fichierCible.txt

Quel langage de script va être utilisé ?
À quel moment sera lancé le script ?

  • juste après chaque ajout d’une ligne dans fichierSource.txt ?
  • ou alors à n’importe quel moment ?
  • est-ce qu’il y aura des caractères { ou } autre part qu’au début et à la fin de chaque ligne ?
  • est-ce que, comme dans l’exemple, chaque ligne se termine par un retour à la ligne ?
  • est-ce que les données récupérées devront êtres ajoutées à un endroit précis dans fichierCible.txt ?
  • ou alors est-ce que les données récupérées devront être ajoutées dans une nouvelle ligne à la fin de fichierCible.txt ?

le plus simple:

  • filtrer les lignes avec accolades
  • supprimer les accolades
    Un truc comme ça peut suffire:
    cat fichier.txt | grep -i '{.*}' | sed 's/[{}]//' > newfichier.txt

Bonjour

En n’utilisant que les fonctionnalités du shell bash :

while read -r; do [[ $REPLY =~ ^\{([^}]*) ]] && echo "${BASH_REMATCH[1]}"; done < fichierSource.txt >> fichierCible.txt

Ce qui donnerait :

michel@debbull:~$ cat fichierSource.txt 
blablablablablablablablabla
blablablablablablablablabla
{!:ù6576ku yhtyu jyyti -(è-(}
blablablablablablablablabla
blablablablablablablablabla
bloblobloblobloblobloluykuyt uyutut
{bli bli bli bli bli     bli bli}
kjg momoo tyrtesdf ù
{aaa eee rrr tt b}
xxxxxxxx x xxxxxxxxx xxxxxxxx
{rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr}
zzzzzzzzzzzzzzzzzzzz
{pppppppppppppp ppppppp}
michel@debbull:~$ 
michel@debbull:~$ cat fichierCible.txt 
badaboumyoupie
petitpatapon
hippopotameentutu
michel@debbull:~$ 
michel@debbull:~$ while read -r; do [[ $REPLY =~ ^\{([^}]*) ]] && echo "${BASH_REMATCH[1]}"; done < fichierSource.txt >> fichierCible.txt 
michel@debbull:~$ 
michel@debbull:~$ cat fichierCible.txt 
badaboumyoupie
petitpatapon
hippopotameentutu
!:ù6576ku yhtyu jyyti -(è-(
bli bli bli bli bli     bli bli
aaa eee rrr tt b
rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr
pppppppppppppp ppppppp
michel@debbull:~$ 

Telle quelle est, la ligne de commande bash que j’ai proposée ne recopiera à la fin de fichierCible.txt que ce qui est dans les lignes contenues dans fichierSource.txt
qui commencent par un caractère { jusqu’au premier caractère } trouvé (caractères { et } exclus).

Mais en fonction des réponses que Le_GensBon donnera aux questions posées dans mon précédent message, on pourra peut-être adapter tout ça à ce qu’il cherche à obtenir.

Ah, tu veux plutôt dire grep -i '{.*}' fichier.txt | sed 's/[{}]//g' > newfichier.txt ?
Le cat ne sert à rien vu que grep sait très bien ouvrir des fichiers (voir « useless use of cat ») et si tu ne mets pas l’option g dans la substitution de sed, seule l’accolade ouvrante sera traitée (la première correspondance de la ligne).

1 J'aime

En n’utilisant que sed :

sed -n '/^{/s/{\([^}]*\)}/\1/p' fichierSource.txt >> fichierCible.txt
2 J'aime

Merci bien @MicP ça fonctionne :wink:

Oui désolé, j’ai écrit un peut vite, et effectivement aucune utilité du cat.

awk -F'{|}' '/{/{print $2}' fichierSource.txt

!:ù6576ku yhtyu jyyti -(è-(
bli bli bli bli bli     bli bli
aaa eee rrr tt b
rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr
pppppppppppppp ppppppp