/sed/ incompréhension ou bug
Fermé
m4ni4k
-
5 avril 2009 à 20:37
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 - 6 avril 2009 à 17:00
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 - 6 avril 2009 à 17:00
A voir également:
- /sed/ incompréhension ou bug
- Bug yahoo mail - Accueil - Mail
- Iptv bug forum ✓ - Forum TV & Vidéo
- Bug chatgpt - Accueil - Intelligence artificielle
- Bug localisation snap ✓ - Forum Snapchat
- Bug yahoo mail 27 fevrier 2024 ✓ - Forum Yahoo mail
3 réponses
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 897
5 avril 2009 à 22:57
5 avril 2009 à 22:57
Salut,
sed '/^@name/!d; s/[^;]*$/\nmenuseparator[id="organizeBookmarksSeparator"],menu[label="Barre personnelle"] {display: none !important;}/';-))
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 897
6 avril 2009 à 08:48
6 avril 2009 à 08:48
Essaie en inversant l'ordre des commandes :
printf 'AA\nBA\nCC'|sed -e '/A/!d' -e '$aZZZZ'
elle affiche donc les deux premières lignes vu qu'elles contiennent un "A", puis passe à la 3ème ligne "CC", qu'elle efface vu qu'il n'y a pas de "A", et une fois la commande "d" exécutée, la commande suivante n'est pas exécutée dans la mesure où le script est relancé depuis le début avec la ligne suivante (aucune vu que la fin du fichier est atteint)...
;-))
$ printf 'AA\nBB\nCC'|sed -e '$aZZZZ' -e '/A/!d' AA ZZZZLa commande "d" (quand elle est appliquée, dans ton cas dès quelle ne rencontre pas de ligne contenant "A") ayant pour conséquence de renvoyer en début de script (donc sans s'occuper des commandes suivantes), en reprenant l'exemple ci-dessus mais dans sa forme 1ère :
printf 'AA\nBA\nCC'|sed -e '/A/!d' -e '$aZZZZ'
elle affiche donc les deux premières lignes vu qu'elles contiennent un "A", puis passe à la 3ème ligne "CC", qu'elle efface vu qu'il n'y a pas de "A", et une fois la commande "d" exécutée, la commande suivante n'est pas exécutée dans la mesure où le script est relancé depuis le début avec la ligne suivante (aucune vu que la fin du fichier est atteint)...
;-))
Peu à peu, grâce à toi notamment, je t'en remercie, je commence à mieux cerner le mécanisme (qui me semble parfois un peu tordu) de sed :-|
Par exemple, dans ce cas ci, même si avec ton explication, tout semble logique, et l'est entièrement dans une certaine mesure, il y a quand même un détail qui me turlupine ou même me gêne.
C'est pour cette raison d'ailleurs que je n'aurais jamais pensé essayer l'inversion que tu m'as suggéré.
(Et, si j'ai superficiellement compris la raison invoquée, je n'ai pas encore pris le temps d'investiguer davantage en quoi ce raisonnement s'imposait au coeur même du développement de sed)
En fait, je ne réalise pas encore tout à fait pourquoi en faisant
printf 'AA\nBB\nCC'|sed -e '$aZZZZ' -e '/A/!d'
les "ZZZZ" ne sont pas avalé par le "sed '/A/!d'" qui suit?!?!?
ça me dépasse, mes neurones pataugent complètement! ;-)))
L'autre problème c'est qu'en procédant dans cet ordre là on peut oublier le regroupemment compacté par ";"
c-a-d que forcément,
printf 'AA\nBB\nCC'|sed '$aZZZZ; /A/!d'
affichera ça:
AA
BB
CC
ZZZZ; /A/!d
Si tu as une autre méthode de combinaison/compactage sans "-e", je suis preneur.
Je n'ai pas encore non plus compris suffisamment l'utilisation des "{ }", mais je suis sûr qu'ils permettent de chouettes petites astuces.
Quoi qu'il en soit, je trouve ça plus rassurant de procéder en respectant les étapes effacement du superflu/ajout de nouveau contenu en toute fin de ligne.
Par exemple, dans ce cas ci, même si avec ton explication, tout semble logique, et l'est entièrement dans une certaine mesure, il y a quand même un détail qui me turlupine ou même me gêne.
C'est pour cette raison d'ailleurs que je n'aurais jamais pensé essayer l'inversion que tu m'as suggéré.
(Et, si j'ai superficiellement compris la raison invoquée, je n'ai pas encore pris le temps d'investiguer davantage en quoi ce raisonnement s'imposait au coeur même du développement de sed)
En fait, je ne réalise pas encore tout à fait pourquoi en faisant
printf 'AA\nBB\nCC'|sed -e '$aZZZZ' -e '/A/!d'
les "ZZZZ" ne sont pas avalé par le "sed '/A/!d'" qui suit?!?!?
ça me dépasse, mes neurones pataugent complètement! ;-)))
L'autre problème c'est qu'en procédant dans cet ordre là on peut oublier le regroupemment compacté par ";"
c-a-d que forcément,
printf 'AA\nBB\nCC'|sed '$aZZZZ; /A/!d'
affichera ça:
AA
BB
CC
ZZZZ; /A/!d
Si tu as une autre méthode de combinaison/compactage sans "-e", je suis preneur.
Je n'ai pas encore non plus compris suffisamment l'utilisation des "{ }", mais je suis sûr qu'ils permettent de chouettes petites astuces.
Quoi qu'il en soit, je trouve ça plus rassurant de procéder en respectant les étapes effacement du superflu/ajout de nouveau contenu en toute fin de ligne.
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 897
6 avril 2009 à 17:00
6 avril 2009 à 17:00
En fait, je ne réalise pas encore tout à fait pourquoi en faisant
printf 'AA\nBB\nCC'|sed -e '$aZZZZ' -e '/A/!d'
les "ZZZZ" ne sont pas avalé par le "sed '/A/!d'" qui suit?!?!?
ça me dépasse, mes neurones pataugent complètement! ;-)))
En fait il semblerait que sed évalue la 1ère condition (si la dernière ligne est atteinte, ajouter ZZZZ) et comme ce n'est pas le cas, qu'il la garde bien au chaud je ne sais où (mémoire tampon quelque part entre les 2 mémoires (principale et secondaire)), qu'il continue d'évaluer le reste des commandes en parsant chaque ligne et qu'une fois arrivé enfin sur la dernière ligne du fichier, qu'il ressorte la 1ère condition de derrière les fagots et l'applique tout simplement... ;-))
Je me suis servi du débugueur (voir SED - Debuggers) pour en arriver à cette conclusion :
;-))
printf 'AA\nBB\nCC'|sed -e '$aZZZZ' -e '/A/!d'
les "ZZZZ" ne sont pas avalé par le "sed '/A/!d'" qui suit?!?!?
ça me dépasse, mes neurones pataugent complètement! ;-)))
En fait il semblerait que sed évalue la 1ère condition (si la dernière ligne est atteinte, ajouter ZZZZ) et comme ce n'est pas le cas, qu'il la garde bien au chaud je ne sais où (mémoire tampon quelque part entre les 2 mémoires (principale et secondaire)), qu'il continue d'évaluer le reste des commandes en parsant chaque ligne et qu'une fois arrivé enfin sur la dernière ligne du fichier, qu'il ressorte la 1ère condition de derrière les fagots et l'applique tout simplement... ;-))
Je me suis servi du débugueur (voir SED - Debuggers) pour en arriver à cette conclusion :
jp@MDK:~/tmpfs ssh$ printf 'AA\nBB\nCC'|Sed -e '$aZZZZ' -e '/A/!d' PATT:AA$ HOLD:$ COMM:$ a\\NZZZZ PATT:AA$ HOLD:$ COMM:/A/ !d PATT:AA$ HOLD:$ AA PATT:BB$ HOLD:$ COMM:$ a\\NZZZZ PATT:BB$ HOLD:$ COMM:/A/ !d PATT:CC$ HOLD:$ COMM:$ a\\NZZZZ PATT:CC$ HOLD:$ COMM:/A/ !d ZZZZ jp@MDK:~/tmpfs ssh$Les explications sur le debugueur sont dans la FAQ...
;-))
6 avril 2009 à 01:37
je devais encore être trop à la masse, j'ai un peu honte de ne pas y avoir pensé tout seul (sans sous-estimer ton talent bien entendu ;-)))
N'empêche, tant qu'on y est, n'aurais-tu pas une explication du même ordre de logique pour le vrai comportement étrange qui me préoccupe, à savoir pourquoi les 2 premiers cas de figure ne fonctionnent pas comme je l'espèrait (c-a-d en créant une nouvelle ligne contenant ZZZZ tout à la fin) alors que les 3 suivants ne posent aucuns problèmes.
Il doit y avoir un truc élémentaire (ça ne fera qu'un de plus, lol) qui m'échappe, mais lequel?
:~$ printf 'AA\nBB\nCC'|sed -e '/A/!d' -e '$aZZZZ'
AA
:~$ printf 'AA\nBA\nCC'|sed -e '/A/!d' -e '$aZZZZ'
AA
BA
:~$ printf 'AA\nBA\nCA'|sed -e '/A/!d' -e '$aZZZZ'
AA
BA
CA
ZZZZ
:~$ printf AA|sed -e '/A/!d' -e '$aZZZZ'
AA
ZZZZ
:~$ printf AA|sed -e '/^A/!d' -e '$aZZZZ'
AA
ZZZZ