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