Pages : 1
#1 Le 17/04/2019, à 17:14
- diesel
[RESOLU] substitution sed
Bonjour les dieux de sed,
J'ai une variable contenant un chemin (par exemple : /home/jean-marie/toto/'45 tutu/fichier).
Je voudrais traiter cette variable avec sed pour ne garder que fichier.
L'idée est de spécifier que je veux remplacer le motif suivant : 'un slash' 'au moins un caractère différent d'un slash' 'un slash' par 'rien'.
J'ai trouvé une syntaxe qui a l'air de fonctionner mais qui, a priori, ne correspond pas exactement à la spécification de la ligne du dessus
echo $ma_variable | sed -e "s%/.*/%%g"
Vous auriez quoi de mieux à me proposer ?
Amicalement.
Jean-Marie
Dernière modification par diesel (Le 17/04/2019, à 17:45)
Je déteste qu'on cherche à me faire passer pour un con, j'y arrive déjà très bien tout seul.
Le mort, il sait pas qu'il est mort ; c'est pour les autres que c'est dur.................... Pour les cons, c'est pareil.
Hors ligne
#2 Le 17/04/2019, à 17:23
- kamaris
Re : [RESOLU] substitution sed
Si ton but n'est pas directement d'utiliser sed, tu peux utiliser la commande basename, qui fait exactement ça.
Hors ligne
#3 Le 17/04/2019, à 17:24
- MicP
Re : [RESOLU] substitution sed
Bonjour
En utilisant l'interpréteur de commandes bash :
michel@debg53sw:~$ ma_variable="/home/jean-marie/toto/'45 tutu/fichier"
michel@debg53sw:~$
michel@debg53sw:~$ echo "${ma_variable##*/}"
fichier
michel@debg53sw:~$
Dernière modification par MicP (Le 17/04/2019, à 17:28)
Hors ligne
#4 Le 17/04/2019, à 17:38
- diesel
Re : [RESOLU] substitution sed
Si ton but n'est pas directement d'utiliser sed, tu peux utiliser la commande basename, qui fait exactement ça.
Oui...,
Sauf que
jean-marie@jean-marie:~/Bryan Adams$ ma_variable="/home/jean-marie/toto/'45 tutu/fichier"
jean-marie@jean-marie:~/Bryan Adams$ basename $ma_variable
'45
jean-marie@jean-marie:~/Bryan Adams$
C'est pô ça que je veux.
Amicalement.
Jean-Marie
Je déteste qu'on cherche à me faire passer pour un con, j'y arrive déjà très bien tout seul.
Le mort, il sait pas qu'il est mort ; c'est pour les autres que c'est dur.................... Pour les cons, c'est pareil.
Hors ligne
#5 Le 17/04/2019, à 17:38
- pingouinux
Re : [RESOLU] substitution sed
Bonjour,
@diesel83140 :
La bonne commande avec sed est celle-ci, car le chemin peut être relatif et ne pas commancer par /.
echo "$ma_variable" | sed -e "s%.*/%%"
ou
sed -e "s%.*/%%" <<<"$ma_variable"
Sinon, les suggestions de kamaris ou MicP sont plus simples.
Hors ligne
#6 Le 17/04/2019, à 17:40
- pingouinux
Re : [RESOLU] substitution sed
Et les " " …
$ ma_variable="/home/jean-marie/toto/'45 tutu/fichier"
$ basename $ma_variable
'45
$ basename "$ma_variable"
fichier
Hors ligne
#7 Le 17/04/2019, à 17:40
- diesel
Re : [RESOLU] substitution sed
Bonjour
En utilisant l'interpréteur de commandes bash :
michel@debg53sw:~$ ma_variable="/home/jean-marie/toto/'45 tutu/fichier" michel@debg53sw:~$ michel@debg53sw:~$ echo "${ma_variable##*/}" fichier michel@debg53sw:~$
Ça, ça me plaît beaucoup (et ça répond parfaitement à mon problème).
Cela étant, ça m'intéresse aussi de savoir comment faire avec sed.
Amicalement.
Jean-Marie
Je déteste qu'on cherche à me faire passer pour un con, j'y arrive déjà très bien tout seul.
Le mort, il sait pas qu'il est mort ; c'est pour les autres que c'est dur.................... Pour les cons, c'est pareil.
Hors ligne
#8 Le 17/04/2019, à 17:42
- diesel
Re : [RESOLU] substitution sed
Et les " " …
$ ma_variable="/home/jean-marie/toto/'45 tutu/fichier" $ basename $ma_variable '45 $ basename "$ma_variable" fichier
Et pourtant, il me semblait bien avoir essayé avec les doubles quotes.
Amicalement.
Jean-Marie
Je déteste qu'on cherche à me faire passer pour un con, j'y arrive déjà très bien tout seul.
Le mort, il sait pas qu'il est mort ; c'est pour les autres que c'est dur.................... Pour les cons, c'est pareil.
Hors ligne
#9 Le 17/04/2019, à 17:48
- diesel
Re : [RESOLU] substitution sed
Bonjour,
@diesel83140 :
La bonne commande avec sed est celle-ci, car le chemin peut être relatif et ne pas commancer par /.echo "$ma_variable" | sed -e "s%.*/%%"
ou
sed -e "s%.*/%%" <<<"$ma_variable"
Sinon, les suggestions de kamaris ou MicP sont plus simples.
Merci Pingouinux,
Dans mon cas, le chemin est forcement absolu.
Et comment spécifier : 'un slash', 'au moins un caractère différent de slash', 'un slash' ?
Amicalement.
Jean-Marie
Je déteste qu'on cherche à me faire passer pour un con, j'y arrive déjà très bien tout seul.
Le mort, il sait pas qu'il est mort ; c'est pour les autres que c'est dur.................... Pour les cons, c'est pareil.
Hors ligne
#10 Le 17/04/2019, à 18:01
- pingouinux
Re : [RESOLU] substitution sed
Et comment spécifier : 'un slash', 'au moins un caractère différent de slash', 'un slash' ?
Tu n'en as pas besoin ici, et tu nobtiendrais pas ce que tu veux.
Sinon, c'est :
$ sed -r "s%/[^/]+/%%" <<<"$ma_variable"
jean-marie/toto/'45 tutu/fichier
$ sed -r "s%/[^/]+/%%g" <<<"$ma_variable"
jean-marie'45 tutu/fichier
Hors ligne
#11 Le 17/04/2019, à 18:50
- diesel
Re : [RESOLU] substitution sed
diesel83140 #9 a écrit :Et comment spécifier : 'un slash', 'au moins un caractère différent de slash', 'un slash' ?
Tu n'en as pas besoin ici, et tu nobtiendrais pas ce que tu veux.
Sinon, c'est :$ sed -r "s%/[^/]+/%%" <<<"$ma_variable" jean-marie/toto/'45 tutu/fichier $ sed -r "s%/[^/]+/%%g" <<<"$ma_variable" jean-marie'45 tutu/fichier
Merci encore.
J'avais essayé cette syntaxe (et effectivement, à la réflexion, ça ne répond pas globalement au problème), et je crois que j'avais oublié le -E ou -r
Amicalement.
Jean-Marie
Je déteste qu'on cherche à me faire passer pour un con, j'y arrive déjà très bien tout seul.
Le mort, il sait pas qu'il est mort ; c'est pour les autres que c'est dur.................... Pour les cons, c'est pareil.
Hors ligne
#12 Le 17/04/2019, à 19:46
- diesel
Re : [RESOLU] substitution sed
Pour clore "définitivement" le sujet, la commande "basename" ne fonctionne pas pour ce que j'essaye de faire dans la mesure où l'arborescence contenue dans ma variable pointe sur un répertoire et non un fichier.
Finalement, j'ai retenu la solution proposée par MicP qui fonctionne parfaitement.
Amicalement.
Jean-Marie
Je déteste qu'on cherche à me faire passer pour un con, j'y arrive déjà très bien tout seul.
Le mort, il sait pas qu'il est mort ; c'est pour les autres que c'est dur.................... Pour les cons, c'est pareil.
Hors ligne
#13 Le 17/04/2019, à 20:03
- pingouinux
Re : [RESOLU] substitution sed
Pour clore "définitivement" le sujet, la commande "basename" ne fonctionne pas pour ce que j'essaye de faire dans la mesure où l'arborescence contenue dans ma variable pointe sur un répertoire et non un fichier.
Finalement, j'ai retenu la solution proposée par MicP qui fonctionne parfaitement.
Je ne comprends pas. basename va te retourner la partie après le dernier /, que ce soit un répertoire ou un fichier, comme la commande de MicP.
Édité :
Plus exactement, ces commandes suppriment le dernier / et tout ce qui précède.
Dernière modification par pingouinux (Le 17/04/2019, à 20:06)
Hors ligne
#14 Le 17/04/2019, à 20:07
- kamaris
Re : [RESOLU] substitution sed
Pas si il n'y a rien après le dernier /
Hors ligne
#15 Le 17/04/2019, à 20:35
- diesel
Re : [RESOLU] substitution sed
diesel83140 #12 a écrit :Pour clore "définitivement" le sujet, la commande "basename" ne fonctionne pas pour ce que j'essaye de faire dans la mesure où l'arborescence contenue dans ma variable pointe sur un répertoire et non un fichier.
Finalement, j'ai retenu la solution proposée par MicP qui fonctionne parfaitement.
Je ne comprends pas. basename va te retourner la partie après le dernier /, que ce soit un répertoire ou un fichier, comme la commande de MicP.
Édité :
Plus exactement, ces commandes suppriment le dernier / et tout ce qui précède.
Ben..., je ne peux plus retrouver le script dans l'état où il était, mais 'basename' râlait en disant que ce n'était pas un fichier.
Par contre, je viens de faire un petit essai et là, ça fonctionne.
Enfin, comme j'avais quelques caractères à virer en plus des "/xxx/yyy/zzz/", la solution directe via bash est la meilleure pour moi dans ce contexte.
Amicalement.
Jean-Marie
Je déteste qu'on cherche à me faire passer pour un con, j'y arrive déjà très bien tout seul.
Le mort, il sait pas qu'il est mort ; c'est pour les autres que c'est dur.................... Pour les cons, c'est pareil.
Hors ligne
#16 Le 17/04/2019, à 21:17
- kamaris
Re : [RESOLU] substitution sed
Ah, je pensais que par « l'arborescence contenue dans ma variable pointe sur un répertoire et non un fichier », tu voulais dire que ton chemin se terminait par /. Car si var="/répertoire/", alors basename "$var" donne répertoire, tandis que les autres méthodes renvoient une chaine vide.
Dernière modification par kamaris (Le 17/04/2019, à 21:20)
Hors ligne
#17 Le 17/04/2019, à 21:35
- diesel
Re : [RESOLU] substitution sed
Ah, je pensais que par « l'arborescence contenue dans ma variable pointe sur un répertoire et non un fichier », tu voulais dire que ton chemin se terminait par /. Car si var="/répertoire/", alors basename "$var" donne répertoire, tandis que les autres méthodes renvoient une chaine vide.
Ce que je voulais dire, c'est que si l'arborescence complète est "/home/jean-marie/toto/tutu/titi/tata.txt", la variable ne contient que "/home/jean-marie/toto/tutu"
De toutes manières, qu'il y ait un slash à la fin de la chaîne de caractères contenue dans la variable ou non, ça donne bien la même chose. Je ne sais pas quelle connerie j'ai trouvé à écrire pour réussir à faire râler "basename".
Amicalement.
Jean-Marie
Dernière modification par diesel (Le 17/04/2019, à 21:37)
Je déteste qu'on cherche à me faire passer pour un con, j'y arrive déjà très bien tout seul.
Le mort, il sait pas qu'il est mort ; c'est pour les autres que c'est dur.................... Pour les cons, c'est pareil.
Hors ligne
#18 Le 17/04/2019, à 21:41
- Arbiel
Re : [RESOLU] substitution sed
Il me semble que
sed -r "s|([^/]*/)*([^/]+)/?$|\2|" <<< "${var}"
ou
sed -r "s|([^/]*/)*([^/]+/?)$|\2|" <<< "${var}"
fonctionne dans tous les cas de figure, selon que l'on veut ou non conserver l'éventuel dernier /.
remi@remi-Vostro-3550:~$ for var in "aie/ier/fichier" "/ier/mstr/fichier" "nst/inst/rep/" "/nstrt/sntn/nrep/"; do sed -r "s|([^/]*/)*([^/]+)/?$|\2|" <<< "${var}"; done;
fichier
fichier
rep
nrep
remi@remi-Vostro-3550:~$ for var in "aie/ier/fichier" "/ier/mstr/fichier" "nst/inst/rep/" "/nstrt/sntn/nrep/"; do sed -r "s|([^/]*/)*([^/]+/?)$|\2|" <<< "${var}"; done;
fichier
fichier
rep/
nrep/
remi@remi-Vostro-3550:~$
Dernière modification par Arbiel (Le 17/04/2019, à 21:44)
Arbiel Perlacremaz
LDLC Aurore NK3S-8-S4 Ubuntu 20.04, GNOME 3.36.8
24.04 en cours de tests
Abandon d'azerty au profit de bépo, de google au profit de Lilo et de la messagerie électronique violable au profit de Protonmail, une messagerie chiffrée de poste de travail à poste de travail.
Hors ligne