# Parser un fichier texte

**URL:** <https://www.debian-fr.org/t/parser-un-fichier-texte/86774>\
**Category:** Programmation\
**Tags:** script\
**Created:** [Juillet 7, 2022, 2:45 UTC](https://www.debian-fr.org/t/parser-un-fichier-texte/86774 "2022-07-07T14:45:39Z")\
**Posts on this page:** 9\
**Page:** 1

<div class="post-metadata">

**Author:** ![Le\_GensBon](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/l/dc4da7/32.png) [@Le\_GensBon](https://www.debian-fr.org/u/Le_GensBon)\
**Post date:** [Juillet 7, 2022, 2:45 UTC](https://www.debian-fr.org/t/parser-un-fichier-texte/86774/1 "2022-07-07T14:45:39Z")

</div>

Bonjour bonjour,

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

```nohighlight
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.

---

<div class="post-metadata">

**Author:** ![anon29980398](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/a/f4b2a3/32.png) [@anon29980398](https://www.debian-fr.org/u/anon29980398)\
**Post date:** [Juillet 7, 2022, 3:36 UTC](https://www.debian-fr.org/t/parser-un-fichier-texte/86774/2 "2022-07-07T15:36:44Z")

</div>

Bonjour

> [@Le\_GensBon](#):
>
> …j’ai un fichier texte de ce type :  
> …il respectera toujours ce format.…

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.

* * *

> [@Le\_GensBon](#):
>
> … un script qui permettrait de venir récupérer les données dans les accolades et les mettre dans un autres fichier txt.

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` ?

---

<div class="post-metadata">

**Author:** ![Zargos](https://www.debian-fr.org/user_avatar/www.debian-fr.org/zargos/32/10889_2.png) [@Zargos](https://www.debian-fr.org/u/Zargos)\
**Post date:** [Juillet 7, 2022, 6:32 UTC](https://www.debian-fr.org/t/parser-un-fichier-texte/86774/3 "2022-07-07T18:32:54Z")

</div>

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`

---

<div class="post-metadata">

**Author:** ![anon29980398](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/a/f4b2a3/32.png) [@anon29980398](https://www.debian-fr.org/u/anon29980398)\
**Post date:** [Juillet 8, 2022, 4:31 UTC](https://www.debian-fr.org/t/parser-un-fichier-texte/86774/4 "2022-07-08T04:31:57Z")

</div>

Bonjour

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

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

```

Ce qui donnerait :

```nohighlight
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:~$ 

```

```nohighlight
michel@debbull:~$ cat fichierCible.txt 
badaboumyoupie
petitpatapon
hippopotameentutu
michel@debbull:~$ 

```

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

```

```nohighlight
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**](https://www.debian-fr.org/u/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.

---

<div class="post-metadata">

**Author:** ![Almtesh](https://www.debian-fr.org/user_avatar/www.debian-fr.org/almtesh/32/10312_2.png) [@Almtesh](https://www.debian-fr.org/u/Almtesh)\
**Post date:** [Juillet 8, 2022, 7:19 UTC](https://www.debian-fr.org/t/parser-un-fichier-texte/86774/5 "2022-07-08T07:19:09Z")

</div>

> [@Zargos](#):
>
> `cat fichier.txt | grep -i '{.*}' | sed 's/[{}]//' > newfichier.txt`

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).

---

<div class="post-metadata">

**Author:** ![anon29980398](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/a/f4b2a3/32.png) [@anon29980398](https://www.debian-fr.org/u/anon29980398)\
**Post date:** [Juillet 8, 2022, 8:05 UTC](https://www.debian-fr.org/t/parser-un-fichier-texte/86774/6 "2022-07-08T08:05:02Z")

</div>

En n’utilisant que `sed` :

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

```

---

<div class="post-metadata">

**Author:** ![Le\_GensBon](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/l/dc4da7/32.png) [@Le\_GensBon](https://www.debian-fr.org/u/Le_GensBon)\
**Post date:** [Juillet 8, 2022, 8:34 UTC](https://www.debian-fr.org/t/parser-un-fichier-texte/86774/7 "2022-07-08T08:34:32Z")

</div>

Merci bien @anon29980398 ça fonctionne 😉

---

<div class="post-metadata">

**Author:** ![Zargos](https://www.debian-fr.org/user_avatar/www.debian-fr.org/zargos/32/10889_2.png) [@Zargos](https://www.debian-fr.org/u/Zargos)\
**Post date:** [Juillet 8, 2022, 9:36 UTC](https://www.debian-fr.org/t/parser-un-fichier-texte/86774/8 "2022-07-08T09:36:02Z")

</div>

> [@Almtesh](#):
>
> Ah, tu veux plutôt dire `grep -i '{.*}'`

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

---

<div class="post-metadata">

**Author:** ![Verner](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/v/34f0e0/32.png) [@Verner](https://www.debian-fr.org/u/Verner)\
**Post date:** [Juillet 9, 2022, 10:09 UTC](https://www.debian-fr.org/t/parser-un-fichier-texte/86774/9 "2022-07-09T10:09:22Z")

</div>

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

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

```
