J'ai vraiment du mal avec sed....
Résolu/Fermé
vieurou
Messages postés
73
Date d'inscription
jeudi 13 septembre 2007
Statut
Membre
Dernière intervention
19 décembre 2007
-
18 sept. 2007 à 17:20
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 - 20 sept. 2007 à 19:52
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 - 20 sept. 2007 à 19:52
A voir également:
- J'ai vraiment du mal avec sed....
- Mon pc a du mal à démarrer ✓ - Forum Matériel & Système
- Comment avoir un proxy du mali avec orange - Forum Réseaux sociaux
- Sed crlf - Astuces et Solutions
- Carte roblox mal gratté ✓ - Forum Jeux vidéo
- Combien de joules pour faire mal - Forum Loisirs / Divertissements
21 réponses
vieurou
Messages postés
73
Date d'inscription
jeudi 13 septembre 2007
Statut
Membre
Dernière intervention
19 décembre 2007
2
20 sept. 2007 à 17:04
20 sept. 2007 à 17:04
$ A='if_lt r4.x, c0.b' $ echo $A if_lt r4.x, c0.b $ echo $A |sed -r 's/if_(..).*[a-zA-Z][0-9]*\.([a-z]).*[a-z]$/IF \U\1\E.\2/' IF LT.x $ cat test.psh if_lt r4.x, c0.b $ sed -r -i.orig 's/if_(..).*[a-zA-Z][0-9]*\.([a-z]).*[a-z]$/IF \U\1\E.\2/' test.psh $ cat test.psh if_lt r4.x, c0.b $ cat test.psh.orig if_lt r4.x, c0.b $ sed -r -i 's/if_(..).*[a-zA-Z][0-9]*\.([a-z]).*[a-z]$/IF \U\1\E.\2/' test.psh $ cat test.psh if_lt r4.x, c0.b $ sed -r 's/if_(..).*[a-zA-Z][0-9]*\.([a-z]).*[a-z]$/IF \U\1\E.\2/' test.psh > retest.psh $ cat retest.psh if_lt r4.x, c0.b
j'y comprend rien , pourquoi ça marche chez vous et pas chez moi ???
par contre
$ echo 'if_lt r4.x, c0.b' > rere $ cat rere if_lt r4.x, c0.b $ sed -r -i 's/if_(..).*[a-zA-Z][0-9]*\.([a-z]).*[a-z]$/IF \U\1\E.\2/' rere $ cat rere IF LT.x
etrange....
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 567
20 sept. 2007 à 19:52
20 sept. 2007 à 19:52
mets ton fichier sur cjoint.com pour voir ce qui ne vas pas
tu peux le compresser avant de le mettre
tu peux le compresser avant de le mettre
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 894
18 sept. 2007 à 18:02
18 sept. 2007 à 18:02
Re-
Si la structure du motif est toujours la même, à savoir :
if underscore 2 caractères espace 2 caractères 1 point 1 caractère 1 virgule etc..."
alors ça devrait faire l'affaire :
sed insertion de texte#echanger une ligne avec c
;-))
Si la structure du motif est toujours la même, à savoir :
if underscore 2 caractères espace 2 caractères 1 point 1 caractère 1 virgule etc..."
alors ça devrait faire l'affaire :
sed 's/if_../\U&/;s/_/ /;s/\(.....\)...\(..\).*/\1\2/'Concernant ta demande de remplacement d'une ligne entière voir :
sed insertion de texte#echanger une ligne avec c
;-))
vieurou
Messages postés
73
Date d'inscription
jeudi 13 septembre 2007
Statut
Membre
Dernière intervention
19 décembre 2007
2
20 sept. 2007 à 10:23
20 sept. 2007 à 10:23
merci de ton aide
cependant ça marche pas vraiment
plusieurs truc
dans mon script, ma ligne
ne fonctionne pas , sed me renvoie
si je retire ses accolades il me dit
cette ligne devrait normalement me rajouter "ADD CC, r+un_chiffre" au dessus de toute les occurrences de "if_lt r8.z, c0.b" ou "if_en r8.x, d0.x"par exemple
ensuite
apparement "sed 's/if_../\U&/;s/_/ /;" passe bien c'est le troisieme partie "s/\(.....\)...\(..\).*/\1\2/" qui a du mal
merci d'avance
cependant ça marche pas vraiment
plusieurs truc
dans mon script, ma ligne
sed -i -e '/^[ ]*#\|^$\|^\n*$/! {/if_.. r\([0-9]\+\)/i\ADD CC, r\1}' $file$tmp1
ne fonctionne pas , sed me renvoie
sed: -e expression n°1, caractère 0: `{' non refermée
si je retire ses accolades il me dit
sed: -e expression n°1, caractère 34: commande inconnue: `/'
cette ligne devrait normalement me rajouter "ADD CC, r+un_chiffre" au dessus de toute les occurrences de "if_lt r8.z, c0.b" ou "if_en r8.x, d0.x"par exemple
ensuite
sed 's/if_../\U&/;s/_/ /;s/\(.....\)...\(..\).*/\1\2/'plante mon script s'arrete et c'est tout ...
apparement "sed 's/if_../\U&/;s/_/ /;" passe bien c'est le troisieme partie "s/\(.....\)...\(..\).*/\1\2/" qui a du mal
merci d'avance
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 894
20 sept. 2007 à 11:09
20 sept. 2007 à 11:09
Ben chez moi ça passe bien, à part la référence arrière dans la 1ère partie :
;-))
[tmpfs]$ A='if_lt r4.x, c0.b\nif_gt r4.w, c0.b' [tmpfs]$ echo -e "$A" if_lt r4.x, c0.b if_gt r4.w, c0.b [tmpfs]$ echo -e "$A" | sed '/if_.. r\([0-9]\+\)/i\ADD CC, r\1' ADD CC, r1 if_lt r4.x, c0.b ADD CC, r1 if_gt r4.w, c0.b [tmpfs]$Et pour la seconde partie :
[tmpfs]$ A='if_lt r4.x, c0.b\nif_gt r4.w, c0.b' [tmpfs]$ echo -e "$A" if_lt r4.x, c0.b if_gt r4.w, c0.b [tmpfs]$ echo -e "$A" | sed 's/if_../\U&/;s/_/ /;s/\(.....\)...\(..\).*/\1\2/' IF LT.x IF GT.w [tmpfs]$Donc je sais pas ce qui cloche, peut être que l'expression ne matche pas exactement ce qu'il faut en fonction du fichier original... moi je ne te propose que des bribes de code en fonction des éléments que tu me fournis.
;-))
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
vieurou
Messages postés
73
Date d'inscription
jeudi 13 septembre 2007
Statut
Membre
Dernière intervention
19 décembre 2007
2
20 sept. 2007 à 11:03
20 sept. 2007 à 11:03
autrement j'ai essaye ça qui me donne presque ce que je veut :
sauf que au niveau de la fin de la ligne ("...\nIF LT/}' ...") je voudrait qu'il ne mette pas seulement LT mais si c'est if_en qu'il me mette EN.
et aussi qu'il me supprime ce qui suit le IF LT.x.
le mieux serait qu'il me remplace la ligne "if_lt r4.x, c0.b " par "ADD CC, r4\nIF LT.x" ( d'ou mon ps au premier post) ou un autre exemple, qu'il me remplace la ligne "if_en r18.z, c8.b " par "ADD CC, r18\nIF EN.z"
sed -i -e '/^[ ]*#\|^$\|^\n*$\|^\!\!ARBfp/! {s/\<if_.. r\([0-9]\+\)\>/ADD CC, r\1\nIF LT/}' $file
sauf que au niveau de la fin de la ligne ("...\nIF LT/}' ...") je voudrait qu'il ne mette pas seulement LT mais si c'est if_en qu'il me mette EN.
et aussi qu'il me supprime ce qui suit le IF LT.x.
le mieux serait qu'il me remplace la ligne "if_lt r4.x, c0.b " par "ADD CC, r4\nIF LT.x" ( d'ou mon ps au premier post) ou un autre exemple, qu'il me remplace la ligne "if_en r18.z, c8.b " par "ADD CC, r18\nIF EN.z"
vieurou
Messages postés
73
Date d'inscription
jeudi 13 septembre 2007
Statut
Membre
Dernière intervention
19 décembre 2007
2
20 sept. 2007 à 11:18
20 sept. 2007 à 11:18
effectivement quand je retire /^[ ]*#\|^$\|^\n*$/! pour la ligne sed -i -e '/^[ ]*#\|^$\|^\n*$/! /if_.. r\([0-9]\+\)/i\ADD CC, r\1' $file ça fonctionne . le problème viens donc de ce /^[ ]*#\|^$\|^\n*$/! qui me filtre tout le code commenté
ce qui est bizarre c'est que je l'utilise dans tout mes autres sed et il fonctionne bien
....j'avais pas vu qu'il me mettait 1 partout à la place de 4 dans ton exemple , mais la commande du post juste au dessus pourrait faire l'affaire si je peut récupérer le deux caractère après le if_ pour la réutiliser en majuscule, et si il me faisait une substitution de la ligne plutôt que des caractères
ce qui est bizarre c'est que je l'utilise dans tout mes autres sed et il fonctionne bien
....j'avais pas vu qu'il me mettait 1 partout à la place de 4 dans ton exemple , mais la commande du post juste au dessus pourrait faire l'affaire si je peut récupérer le deux caractère après le if_ pour la réutiliser en majuscule, et si il me faisait une substitution de la ligne plutôt que des caractères
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 894
20 sept. 2007 à 11:55
20 sept. 2007 à 11:55
Tiens essaie ça à la place :
[tmpfs]$ A='if_lt r4.x, c0.b\nif_gt r5.w, c0.b' [tmpfs]$ echo -e "$A" if_lt r4.x, c0.b if_gt r5.w, c0.b [tmpfs]$ echo -e "$A" | sed '/if_.. r\([0-9]\+\).*/{h;s//ADD CC, r\1/;G}' ADD CC, r4 if_lt r4.x, c0.b ADD CC, r5 if_gt r5.w, c0.b [tmpfs]$;-))
vieurou
Messages postés
73
Date d'inscription
jeudi 13 septembre 2007
Statut
Membre
Dernière intervention
19 décembre 2007
2
20 sept. 2007 à 12:04
20 sept. 2007 à 12:04
cool ,
pour le ADD CC, r+le_nombre, c'est bon
maintenant je suis enbetter encore pour 2 choses
1) comment concatener les filtres "/if_/" et "/^[ ]*#\|^$\|^\n*$/!" ???
2) pour la commande "sed 's/if_../\U&/;s/_/ /;s/\(.....\)...\(..\).*/\1\2/'" elle fonctionne uniquement si r est suivi d'un chiffre , ça ne fonctionne pas avec un nombre ( c'est ok avec 5 par exemple mais pas avec 19)
pour le ADD CC, r+le_nombre, c'est bon
maintenant je suis enbetter encore pour 2 choses
1) comment concatener les filtres "/if_/" et "/^[ ]*#\|^$\|^\n*$/!" ???
2) pour la commande "sed 's/if_../\U&/;s/_/ /;s/\(.....\)...\(..\).*/\1\2/'" elle fonctionne uniquement si r est suivi d'un chiffre , ça ne fonctionne pas avec un nombre ( c'est ok avec 5 par exemple mais pas avec 19)
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 894
20 sept. 2007 à 13:34
20 sept. 2007 à 13:34
1) comment concatener les filtre "/if_/" et "/^[ ]*#\|^$\|^\n*$/!" ???
Pour le 2) je cale sur un problème de regex qui me fait carrément #*?!$ ;-[
Soit la variable :
Par contre la même en demandant uniquement la lettre sans la virgule (donc un caractère) :
lami20j si tu passes par là, tu seras plus que le bienvenu ;-)))
Merci d'avance.
sed '/^[ ]*#\|^$\|^\n*$/! {/if_/ {...}}'
Pour le 2) je cale sur un problème de regex qui me fait carrément #*?!$ ;-[
Soit la variable :
$ echo -e "$A" if_lt r4.x, c0.b if_gt r5.w, c0.bSoit la regex suivante (la partie en gras, correspondant à la référence arrière "3", donc 2 caractères à matcher) :
$ echo -e "$A" | sed '/if_.. r\([0-9]\+\).*/{s/if_../\U&/;s/_/ /;s/\(.....\)\( .*[^\.]\.\)\(..\).*/\1.\3/}' IF LT.x, IF GT.w,Qui marche très bien puisqu'elle me renvoie bien une lettre et la virgule qui suit.
Par contre la même en demandant uniquement la lettre sans la virgule (donc un caractère) :
$ echo -e "$A" | sed '/if_.. r\([0-9]\+\).*/{s/if_../\U&/;s/_/ /;s/\(.....\)\( .*[^\.]\.\)\(.\).*/\1.\3/}' IF LT.b IF GT.bMe renvoie le dernier caractère sur la ligne !!!??? Whyyyyyyyy ??????
lami20j si tu passes par là, tu seras plus que le bienvenu ;-)))
Merci d'avance.
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 567
20 sept. 2007 à 14:06
20 sept. 2007 à 14:06
Salut,
il ne faut pas oublier la gourmandise du quantificateur *
avec [a-z]$ à la fin de regex j'oblige de reconnaître un caractère alpha à la fin, sinon la regex avale tout et affiche la dernière lettre
Voilà.
il ne faut pas oublier la gourmandise du quantificateur *
avec [a-z]$ à la fin de regex j'oblige de reconnaître un caractère alpha à la fin, sinon la regex avale tout et affiche la dernière lettre
Voilà.
# A='if_lt r4.x, c0.b\nif_gt r5.w, c0.b' # echo -e $A |sed '/if_.. r\([0-9]\+\).*[a-z]$/{s/if_../\U&/;s/_/ /;s/\(.....\)\( .*[^\.]\.\)\(.\).*[a-z]$/\1.\3/}' IF LT.x IF GT.wvoir aussi ma version
# A='if_lt r4.x, c0.b\nif_gt r5.w, c0.b' # echo -e $A | sed -r 's/if_(..).*[a-zA-Z][0-9]*\.([a-z]).*[a-z]$/IF \U\1\E.\2/' IF LT.x IF GT.w
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 894
20 sept. 2007 à 14:28
20 sept. 2007 à 14:28
Merci beaucoup ;-))
Mais ça ne m'explique pas pourquoi avec "\(..\)" ça marche et pas avec "\(.\)" ?!
Même si je sais que les regex sont gourmandes.
Mais ça ne m'explique pas pourquoi avec "\(..\)" ça marche et pas avec "\(.\)" ?!
Même si je sais que les regex sont gourmandes.
vieurou
Messages postés
73
Date d'inscription
jeudi 13 septembre 2007
Statut
Membre
Dernière intervention
19 décembre 2007
2
20 sept. 2007 à 14:47
20 sept. 2007 à 14:47
merci beaucoup à vous deux
un dernier truc que je pige pas : les deux commande sed donnée par Lami fonctionne très bien dans un shell , seulement, dès que je les insère dans mon script ben elle ne font rien....
voici comment je les ai noté toutes deux dans le script :
un dernier truc que je pige pas : les deux commande sed donnée par Lami fonctionne très bien dans un shell , seulement, dès que je les insère dans mon script ben elle ne font rien....
voici comment je les ai noté toutes deux dans le script :
sed -i -e '/^[ ]*#\|^$\|^\n*$/! {/if_.. r\([0-9]\+\).*[a-z]$/{s/if_../\U&/;s/_/ /;s/\(.....\)\( .*[^\.]\.\)\(.\).*[a-z]$/\1.\3/}}' $file sed -i -r 's/if_(..).*[a-zA-Z][0-9]*\.([a-z]).*[a-z]$/IF \U\1\E.\2/' $file
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 567
20 sept. 2007 à 14:47
20 sept. 2007 à 14:47
Mais ça ne m'explique pas pourquoi avec "\(..\)" ça marche et pas avec "\(.\)" ?!
C'est toute à fait normal que ça ne marche pas avec "\(.\)"
Prenons notre exemple
A='if_lt r46.x, c0.b\nif_gt r5.w, c0.b'
Cas "\(..\)"
Ici ça marche. Pourquoi?
Avant tu as \.\)
Ce qui veut dire qu'après un point tu cherche un caractère quelconque suit d'un autre caractère et ensuite .* jusqu'à la fin
Ben justement .* avale tout après .. donc après le 1er point suit d'un caractère (dans ce cas x) puisque après b il n'y a rien
Cas "\(.\)"
Avant tu as \.\)
Dans ce cas tu demande qu'après un caractère quelconque la regex exécute .*, mais tu as oublié peut être que .* réussi toujours donc en ce cas la regex ce contente avec rien (* - rien, un, combien tu peux)
Donc le b (le dernière caractère sera reconnu, et ensuite .* se content avec rien.
Tu diras que c'est contradictoire avec la gurmandise citée et evoquée autant de fois.
Mais c'est normal.
Au début .* avale tout (mais ça tu ne le vois pas) et ensuite sous contrainte * est obligé de céder autant de caractères pour que la regex réussisses.
Dans ce cas la regex cède le b, et c'est suffisant pour la réusite globale de la regex.
Je ne sais pas si j'était assez clair.
C'est toute à fait normal que ça ne marche pas avec "\(.\)"
Prenons notre exemple
A='if_lt r46.x, c0.b\nif_gt r5.w, c0.b'
Cas "\(..\)"
Ici ça marche. Pourquoi?
Avant tu as \.\)
Ce qui veut dire qu'après un point tu cherche un caractère quelconque suit d'un autre caractère et ensuite .* jusqu'à la fin
Ben justement .* avale tout après .. donc après le 1er point suit d'un caractère (dans ce cas x) puisque après b il n'y a rien
Cas "\(.\)"
Avant tu as \.\)
Dans ce cas tu demande qu'après un caractère quelconque la regex exécute .*, mais tu as oublié peut être que .* réussi toujours donc en ce cas la regex ce contente avec rien (* - rien, un, combien tu peux)
Donc le b (le dernière caractère sera reconnu, et ensuite .* se content avec rien.
Tu diras que c'est contradictoire avec la gurmandise citée et evoquée autant de fois.
Mais c'est normal.
Au début .* avale tout (mais ça tu ne le vois pas) et ensuite sous contrainte * est obligé de céder autant de caractères pour que la regex réussisses.
Dans ce cas la regex cède le b, et c'est suffisant pour la réusite globale de la regex.
Je ne sais pas si j'était assez clair.
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 894
20 sept. 2007 à 15:01
20 sept. 2007 à 15:01
Cas "\(..\)"
Ici ça marche. Pourquoi?
Avant tu as \.\)
Ce qui veut dire qu'après un point tu cherche un caractère quelconque suit d'un autre caractère et ensuite .* jusqu'à la fin
Ben justement .* avale tout après .. donc après le 1er point suit d'un caractère (dans ce cas x) puisque après b il n'y a rien
Ben non justement, le premier point représente le "x" et le second la virgule, et donc là ça marche.
Cas "\(.\)"
Avant tu as \.\)
Dans ce cas tu demande qu'après un caractère quelconque la regex exécute .*, mais tu as oublié peut être que .* réussi toujours donc en ce cas la regex ce contente avec rien (* - rien, un, combien tu peux)
Donc le b (le dernière caractère sera reconnu, et ensuite .* se content avec rien.
Ben justement c'est ce qu'elle ne fait pas et je comprends par pourquoi malgré tes explications. Pourquoi elle ne retient pas ce caractère quelconque (normalement le "x") ?
Surement que c'est moi qui ai du mal à comprendre, mais je voudrai bien savoir quand même ;-))
Ici ça marche. Pourquoi?
Avant tu as \.\)
Ce qui veut dire qu'après un point tu cherche un caractère quelconque suit d'un autre caractère et ensuite .* jusqu'à la fin
Ben justement .* avale tout après .. donc après le 1er point suit d'un caractère (dans ce cas x) puisque après b il n'y a rien
Ben non justement, le premier point représente le "x" et le second la virgule, et donc là ça marche.
Cas "\(.\)"
Avant tu as \.\)
Dans ce cas tu demande qu'après un caractère quelconque la regex exécute .*, mais tu as oublié peut être que .* réussi toujours donc en ce cas la regex ce contente avec rien (* - rien, un, combien tu peux)
Donc le b (le dernière caractère sera reconnu, et ensuite .* se content avec rien.
Ben justement c'est ce qu'elle ne fait pas et je comprends par pourquoi malgré tes explications. Pourquoi elle ne retient pas ce caractère quelconque (normalement le "x") ?
Surement que c'est moi qui ai du mal à comprendre, mais je voudrai bien savoir quand même ;-))
vieurou
Messages postés
73
Date d'inscription
jeudi 13 septembre 2007
Statut
Membre
Dernière intervention
19 décembre 2007
2
20 sept. 2007 à 15:32
20 sept. 2007 à 15:32
truc bizarre
lorsque le lance le sed comme le fait Lami dans le shell (post 9) ça fonctionne
par contre lorque je fait dans le shell " sed -i -r -e '/^[ ]*#\|^$\|^\n*$/! s/if_(..).*[a-zA-Z][0-9]*\.([a-z]).*[a-z]$/IF \U\1\E.\2/' mon_fichier " ben ça marche pas
exemple qui marche
exemple qui marche pas
lorsque le lance le sed comme le fait Lami dans le shell (post 9) ça fonctionne
par contre lorque je fait dans le shell " sed -i -r -e '/^[ ]*#\|^$\|^\n*$/! s/if_(..).*[a-zA-Z][0-9]*\.([a-z]).*[a-z]$/IF \U\1\E.\2/' mon_fichier " ben ça marche pas
exemple qui marche
$ echo -e $A | sed -r -e '/^[ ]*#\|^$\|^\n*$/! s/if_(..).*[a-zA-Z][0-9]*\.([a-z]).*[a-z]$/IF \U\1\E.\2/' IF LT.x IF GT.w
exemple qui marche pas
$ sed -i -r -e '/^[ ]*#\|^$\|^\n*$/! s/if_(..).*[a-zA-Z][0-9]*\.([a-z]).*[a-z]$/IF \U\1\E.\2/' mon_fichier $ nano mon_fichier if_lt r19.x, c0.z; # 0, 001
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 567
20 sept. 2007 à 15:35
20 sept. 2007 à 15:35
Surement que c'est moi qui ai du mal à comprendre, mais je voudrai bien savoir quand même ;-))
Peut être c'est moi qui a mal expliqué.
Regarde une explication avec des exemples :
\(.....\)
trouve 5 caractères - donc if_lt
\( .*[^\.]\.\)
trouve un espace, ensuite avale tout
sous contrainte un caractère non point et cédé suit d'un point (donc 0.)
\(.\).*
cède un caractère suit de rien (.* réussie dans tous les cas)
le caractère cédé est b
si on écrivait
\(.....\)
la mème chose
\( .*[^\.]\.\)
la même chose
\(..\)
cette fois je cherche un caractère suit d'un autre donc * est obligé de ceder 2 caractères qui son precédés par un point et dans notre cas, * va céder d'abord b ensuite . ensuite 0 ensuite c ensuite espace ensuite , ensuite x et * ne céde plus pusique il a trouvé un point avant le x
\(.*\)
avale tout
Peut être c'est moi qui a mal expliqué.
Regarde une explication avec des exemples :
root@debian:~# A='if_lt r46.x, c0.b' root@debian:~# echo "$A" if_lt r46.x, c0.b root@debian:~# echo "$A" | sed 's/\(.....\)\( .*[^\.]\.\)\(.\).*/\1/' if_lt root@debian:~# echo "$A" | sed 's/\(.....\)\( .*[^\.]\.\)\(.\).*/\2/' r46.x, c0. root@debian:~# echo "$A" | sed 's/\(.....\)\( .*[^\.]\.\)\(.\).*/\3/' b
\(.....\)
trouve 5 caractères - donc if_lt
\( .*[^\.]\.\)
trouve un espace, ensuite avale tout
sous contrainte un caractère non point et cédé suit d'un point (donc 0.)
\(.\).*
cède un caractère suit de rien (.* réussie dans tous les cas)
le caractère cédé est b
si on écrivait
root@debian:~# echo "$A" if_lt r46.x, c0.b root@debian:~# echo "$A" | sed 's/\(.....\)\( .*[^\.]\.\)\(..\)\(.*\)/\1/' if_lt root@debian:~# echo "$A" | sed 's/\(.....\)\( .*[^\.]\.\)\(..\)\(.*\)/\2/' r46. root@debian:~# echo "$A" | sed 's/\(.....\)\( .*[^\.]\.\)\(..\)\(.*\)/\3/' x, root@debian:~# echo "$A" | sed 's/\(.....\)\( .*[^\.]\.\)\(..\)\(.*\)/\4/' c0.b
\(.....\)
la mème chose
\( .*[^\.]\.\)
la même chose
\(..\)
cette fois je cherche un caractère suit d'un autre donc * est obligé de ceder 2 caractères qui son precédés par un point et dans notre cas, * va céder d'abord b ensuite . ensuite 0 ensuite c ensuite espace ensuite , ensuite x et * ne céde plus pusique il a trouvé un point avant le x
\(.*\)
avale tout
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 894
20 sept. 2007 à 15:38
20 sept. 2007 à 15:38
Ok vu comme ça, c'est plus clair mais ça (les regex) reste toujours plus ou moins obscur parfois ;-))
Merci beaucoup encore une fois.
Merci beaucoup encore une fois.
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 567
20 sept. 2007 à 15:47
20 sept. 2007 à 15:47
mais ça (les regex) reste toujours plus ou moins obscur parfois ;-))
ça depends aussi de l'implementation dans les utilitaires
à savoir que le moteurs des regex ne font pas preuves d'inteligence mais de perseverence
une bonne habitude à prendre c'est de construire un regex en commençant avec le 1er jusqu'au dernier caractère, et pas de voir une regex dans son ensemble
c'est d'ailleurs ce que j'ai fait quand j'ai écrit ma version
je ne sais pas pourquoi mais j'ai l'impression que tu as écrit la regex en commençant avec le début mais tu la raisonnes en commençant avec la fin.
vieurou
pour le fait que ça ne marche pas avec ton fichier, c'est parce que on ne sait pas ce ton fichier contient, la structure, etc.
le test a été fait sur une banale variable, mais le contenu de ton fichier peut être bien plus complexe qu'une variable.
ça depends aussi de l'implementation dans les utilitaires
à savoir que le moteurs des regex ne font pas preuves d'inteligence mais de perseverence
une bonne habitude à prendre c'est de construire un regex en commençant avec le 1er jusqu'au dernier caractère, et pas de voir une regex dans son ensemble
c'est d'ailleurs ce que j'ai fait quand j'ai écrit ma version
je ne sais pas pourquoi mais j'ai l'impression que tu as écrit la regex en commençant avec le début mais tu la raisonnes en commençant avec la fin.
vieurou
pour le fait que ça ne marche pas avec ton fichier, c'est parce que on ne sait pas ce ton fichier contient, la structure, etc.
le test a été fait sur une banale variable, mais le contenu de ton fichier peut être bien plus complexe qu'une variable.
vieurou
Messages postés
73
Date d'inscription
jeudi 13 septembre 2007
Statut
Membre
Dernière intervention
19 décembre 2007
2
20 sept. 2007 à 16:21
20 sept. 2007 à 16:21
j'ai créé un fichier pour le test
autre truc bizarre :
du coup , je sais pas ...
une idée???
$ cat test.txt if_lt r19.x, c0.b $ sed -i -r -e '/^[ ]*#\|^$\|^\n*$/! {s/if_(..).*[a-zA-Z][0-9]*\.([a-z]).*[a-z]$/IF \U\1\E.\2/}' test.txt $ cat test.txt if_lt r19.x, c0.b
autre truc bizarre :
$ cat test.txt if_lt r19.x, c0.b $ sed -i -r -e '/^[ ]*#\|^$\|^\n*$/! {s/if_(..).*[a-zA-Z][0-9]*\.([a-z]).*[a-z]$/IF \U\1\E.\2/}' test.txt > retest.txt $ cat retest.txt (--ya rien--)
du coup , je sais pas ...
une idée???
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 894
20 sept. 2007 à 16:36
20 sept. 2007 à 16:36
[tmpfs]$ cat plop if_lt r4.x, c0.b if_gt r15.w, c0.b [tmpfs]$ sed -i.bak '/if_.. r\([0-9]\+\).*/{s/if_../\U&/;s/_/ /;s/\(.....\)\( .*[^\.]\.\)\(.\).*[a-z]$/\1.\3/}' plop [tmpfs]$ cat plop IF LT.x IF GT.w [tmpfs]$;-))
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 567
20 sept. 2007 à 16:36
20 sept. 2007 à 16:36
Regarde chez moi
l'option -i permet la modification sur place
avec la redirection j'écrit au lieu de stdout dans un fichier
# cat vieurou if_lt r46.x, c0.b # sed -r -i.orig 's/if_(..).*[a-zA-Z][0-9]*\.([a-z]).*[a-z]$/IF \U\1\E.\2/' vieurou # cat vieurou IF LT.x # cat vieurou.orig if_lt r46.x, c0.b # mv vieurou.orig vieurou root@debian:~# cat vieurou if_lt r46.x, c0.b # sed -r 's/if_(..).*[a-zA-Z][0-9]*\.([a-z]).*[a-z]$/IF \U\1\E.\2/' vieurou > vieurou_res # cat vieurou if_lt r46.x, c0.b # cat vieurou_res IF LT.x
l'option -i permet la modification sur place
avec la redirection j'écrit au lieu de stdout dans un fichier