#1 Le 27/07/2022, à 06:50
- OlivierM72
modifier un fichier texte. insérer motif si présent après
Bonjour,
j'ai une difficulté pour modifier un fichier texte. Je suis ouvert à toutes les solutions en bash ou éditeur sed, awk, grep...
Les parties du fichier texte que je souhaite modifier se présentent typiquement de la façon suivante:
_face_651
{
type w;
nF 6;
startF 63948413;
inGs 1(RotX);
}
_face_802
{
type w;
nF 3;
startF 63945413;
inGs 1(RotY);
}
Il y a ici 2 sous-ensembles. Le but est, pour chaque sous-ensemble, de récupérer l'information entre parenthèses (ici RotX ou RotY) et de l'insérer en début de 1ère ligne pour chaque (ici devant _face_651 ou _face_802), ce qui donnerait:
RotX_face_651
{
type w;
nF 6;
startF 63948413;
inGs 1(RotX);
}
RotY_face_802
{
type w;
nF 3;
startF 63945413;
inGs 1(RotY);
}
Auriez-vous quelques pistes à m'indiquer pour trouver une solution?
Merci
Hors ligne
#2 Le 27/07/2022, à 08:19
- gigiair
Re : modifier un fichier texte. insérer motif si présent après
Avec Emacs, tu peux effectuer un remplacement avec des regexp, soit en mode interactif
C-M-% \(_face_[0-9]\{3\}[^{]*{[^}]*(\([^)]+\))\) RET \2\1
Soit en mode script (je te laisse le soin de l'écrire, c'est assez trivial, l'essentiel est dans la regexp que l'on peut construire en utilisant M-x re-builder). Dans ce cas la regexp est "\\(_face_[0-9]\\{3\\}[^{]*{[^}]*(\\([^)]+\\))\\)"
L'avantage des regexps de Emacs est qu'elles permettent d'inclure plusieurs lignes dans les captures.
--
JJR.
Hors ligne
#3 Le 27/07/2022, à 09:55
- pingouinux
Re : modifier un fichier texte. insérer motif si présent après
Bonjour,
Avec python :
$ cat script.py
#!/usr/bin/env python3
import re, sys
rec=re.compile('^(_[^\n]+\n{.*?\()(.+?)(\).+?})',re.S|re.M)
sys.stdout.write(rec.sub(r'\2\1\2\3',sys.stdin.read()))
À appeler ainsi :
./script.py <fichier_in >fichier_out
Hors ligne
#4 Le 27/07/2022, à 10:56
- Watael
Re : modifier un fichier texte. insérer motif si présent après
salut,
sed -nz 's/\([^(]*(\([^)]*\))[^_]*\)/\2\1/gp'
?
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne