Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 28/01/2021, à 13:21

ar barzh paour

[Résolu] syntaxe de sed

bonjour à tous
suite à cette discussion
https://forum.ubuntu-fr.org/viewtopic.p … #p22408702

qui pourrait me "décoder" la syntaxe de cette ligne ?

sed '/deb .*ppa.launchpad.net/ s@.*ppa.launchpad.net/\(.*\)/ubuntu.*@\1@p' fichiers

Dernière modification par ar barzh paour (Le 29/01/2021, à 16:28)


PC          : B760M DS3H DDR4,  12th Gen Intel(R) Core(TM) i3-12100, RAM DDR4 8GiB -2400 Ubuntu 20.04, 22.04, 24.04 (en test )
Portable1 : ThinkPad P50 I7-6820HQ, 16G0 Ram Ubuntu 22.04 Ubuntu 24.04 , W10-PRO( en voyage )
Portable2 : T5750  @ 2.00GHz RAM 1GiB DDR2 667 Mhz Ubuntu 20.04 ( batterie HS )
stourm a ran war bep tachenn (Angela Duval) ( Je combats sur tous les fronts )

Hors ligne

#2 Le 28/01/2021, à 17:21

MicP

Re : [Résolu] syntaxe de sed

Bonjour

Je le traduirais comme ça :

EDIT : J'ai oublié de prendre en compte quelques caractères.
Voir plutôt la description de Watael dans le message suivant.

Rechercher une ligne qui contient deb suivit de quelque chose et suivit de ppa.launchpad.net
et n'afficher de cette ligne
que ce qui est entre : ppa.launchpad.net/ et /ubuntu

=======
Par exemple, si le fichier fichiers contient une ligne comme celle là :

deb http://ppa.launchpad.net/webupd8team/java/ubuntu xenial main

dans le retour de la ligne de commande :

sed '/deb .*ppa.launchpad.net/ s@.*ppa.launchpad.net/\(.*\)/ubuntu.*@\1@p' fichiers

il y aura une ligne comme celle là :

webupd8team/java

Dernière modification par MicP (Le 29/01/2021, à 01:24)

Hors ligne

#3 Le 28/01/2021, à 18:18

Watael

Re : [Résolu] syntaxe de sed

pas tout à fait

deb suivi d'une espace, puis un nombre quelconque de caractères (ou zéro), puis ppa, un caractère (parce que le point n'est pas échappé), etc
effectuer la substitution en ne gardant que ce qu'il y a entre .net et /ubuntu (cf. référence arrière), et afficher la ligne (pas uniquement la ligne, parce qu'il n'y a pas l'option -n)

les @ sont le séparateur défini par l'utilisateur pour que celui par défaut (/) ne soit pas confondu avec ce caractère qui est contenu dans une des expressions.

Dernière modification par Watael (Le 29/01/2021, à 01:35)


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#4 Le 29/01/2021, à 01:20

MicP

Re : [Résolu] syntaxe de sed

…pas tout à fait …

Oui, merci pour la correction : j'avais oublié de préciser le caractère espace après deb
et n'avais pas fait attention aux deux caractères point qui ne sont pas échappés.

Hors ligne

#5 Le 29/01/2021, à 09:30

DonutMan75

Re : [Résolu] syntaxe de sed

Hello,
super traduction !
Petite précision quand Watael tu parles de "référence arrière", tu fais bien référence au "\1" ? Ou bien y'a-t-il une subtilité que je n'ai pas vue... ?

D.

Hors ligne

#6 Le 29/01/2021, à 11:54

ar barzh paour

Re : [Résolu] syntaxe de sed

OK MicP et Watael
mais j'y vais petit à petit
(et je remets -n puisqu'à l'origine il était là
dans
sed -n '/deb .*ppa.launchpad.net/ s@.*ppa.launchpad.net/\(.*\)/ubuntu.*@\1@p' fichiers
-n /deb .*ppa.launchpad.net/ ===> ne sélectionner que les lignes qui comportent cette suite de caractères (comme expliquer dans post #3)
s@....... ===> j'essaierai une explication plus tard
exemple de fichier un peu bidon "essai-sed.txt

deb [arch=amd64] htps://repo.skype.com/deb stable main
XXX stable main
deb yyyyyyppa.launchpad.net/ABCDEF/ubuntu universe main
deb zzzzzzppa-launchpad-net/GKLMNO/ubuntu stable main
deb htp://ppa.launchpad.net/webupd8team/java/ubuntu xenial main

ok je comprends le résultat

jpb@jpb-MS-7A70:~$ sed -n '/deb .*ppa.launchpad.net/ p' essai-sed.txt
deb yyyyyyppa.launchpad.net/ABCDEF/ubuntu universe main
deb zzzzzzppa-launchpad-net/GKLMNO/ubuntu stable main
deb htp://ppa.launchpad.net/webupd8team/java/ubuntu xenial main
jpb@jpb-MS-7A70:~$ 

s@......?
je ne connais que s/REGEXP/REPLACEMENT/FLAGS   => (voir plus bas l'explication)

sed -n '/deb .*ppa.launchpad.net/ s@.*ppa.launchpad.net/\(.*\)/ubuntu.*@\1@p' essai-sed.txt
ABCDEF
GKLMNO
webupd8team/java

je ne comprends pas l'utilisation de @ (en tant que séparateur)
@.*ppa.launchpad.net/\(.*\)/ubuntu.*@
mémorise ce qu'il y a entre @.*ppa.launchpad.net/  et /ubuntu.@ 
\1@p imprime ce qui est mémorisé  (@ ????)

mais je constate que j'obtiens le même résultat en remplaçant @ par X

sed -n '/deb .*ppa.launchpad.net/ sX.*ppa.launchpad.net/\(.*\)/ubuntu.*X\1Xp' essai-sed.txt
ABCDEF
GKLMNO
webupd8team/java

mais c'est peut-être mon incompréhension de RegExt
enfin si je ne comprends pas la syntaxe , j'ai compris le but

je pense avoir trouvé
http://sed.sourceforge.net/grabbag/tutorials/sedfaq.txt

4.42. How do I replace "/some/UNIX/path" in a substitution?

   Technically, the normal meaning of the slash can be disabled by
   prefixing it with a backslash. Thus,

     sed 's/\/some\/UNIX\/path/\/a\/new\/path/g' files

   But this is hard to read and write. There is a better solution.
   The s/// substitution command allows '/' to be replaced by any
   other character (including spaces or alphanumerics). Thus,

     sed 's|/some/UNIX/path|/a/new/path|g' files

   and if you are using variable names in a Unix shell script,

     sed "s|$OLDPATH|$NEWPATH|g" oldfile >newfile

d'où l'explication de Watael que je n'avais pas comprise @ remplace /
ce qui peut être utile quand les chaînes ont un /
si xxx et yyy n'ont pas de / on utilisera /
s/xxx\(.*\)yyy/\1/p : mémoriser ce qui est entre xxx et yyy et l'imprimer
si xxx et yyy ont des caractères / on pourra utiliser @ (par exemple)
s@xxx\(.*\)yyy@\1@p : idem , mémoriser ce qui est entre xxx et yyy et l'imprimer

CQFD ?

j'y reviens

sed -n '/chaine0/ s@chaine1\(.*\)chaine2@\1p <<< "$ligne"

si ligne contient chaine0
on imprime ce qu'il y a entre chaine1 et chaine2
chaine1 et chaine 2 peuvent contenir  /  mais pas @


ligne="debut tartempion  deb     uvt ppaXlaunchpadYnet/xABCDEFy/ubuntufinde chaine"

jpb@U20-04-e3:~$ sed -n '/deb .*ppa.launchpad.net/ s@.*ppa.launchpad.net/\(.*\)/ubuntu.*@\1@p' <<<"$ligne"
xABCDEFy

Dernière modification par ar barzh paour (Le 09/03/2021, à 15:43)


PC          : B760M DS3H DDR4,  12th Gen Intel(R) Core(TM) i3-12100, RAM DDR4 8GiB -2400 Ubuntu 20.04, 22.04, 24.04 (en test )
Portable1 : ThinkPad P50 I7-6820HQ, 16G0 Ram Ubuntu 22.04 Ubuntu 24.04 , W10-PRO( en voyage )
Portable2 : T5750  @ 2.00GHz RAM 1GiB DDR2 667 Mhz Ubuntu 20.04 ( batterie HS )
stourm a ran war bep tachenn (Angela Duval) ( Je combats sur tous les fronts )

Hors ligne