/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
En voulant manipuler le fichier "userChrome-example-css" de firefox en une seule opération d'édition, j'ai été confronté à un obstacle que je ne comprends pas très bien.

L'opération étant la suivante:

sed -i '/^@name/!d; s/[^;]*$//; $a\menuseparator[id="organizeBookmarksSeparator"],menu[label="Barre personnelle"] {display: none !important;}' ~/.mozilla/firefox/*.default/chrome/userChrome-example.css

les 2 premières opérations se font sans accros, tandis que l'addition de ligne finale ne se fait tout simplement pas ( sauf si je relance la même commande une seconde fois, c-a-d lorsque le fichier est déjà épuré et ne contient plus que la ligne "@name....")

Quelqu'un pourrait-il me dire en quoi mon script n'est pas tout à fait réglementaire et comment le rendre plus adéquat?

Et la cerise sur le code, ce serait d'intégrer dans la foulée la commande "rename 's/-example//' ~/.mozilla/firefox/*.default/chrome/userChrome-example.css", même si je ne crois pas au miracle, on ne sait jamais?!

Toutes vos suggestions sont les bienvenues, merci.
A voir également:

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
Salut,
sed '/^@name/!d; s/[^;]*$/\nmenuseparator[id="organizeBookmarksSeparator"],menu[label="Barre personnelle"] {display: none !important;}/' 
;-))
0
Joli!!!
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
0
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
Essaie en inversant l'ordre des commandes :
$ printf 'AA\nBB\nCC'|sed -e '$aZZZZ' -e '/A/!d'
AA
ZZZZ
La 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)...

;-))
0
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.
0
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
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 :
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...

;-))
0