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 17/04/2019, à 18: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, à 18: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, à 18: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, à 18: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, à 18:28)

Hors ligne

#4 Le 17/04/2019, à 18:38

diesel

Re : [RESOLU] substitution sed

kamaris a écrit :

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, à 18: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, à 18: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, à 18:40

diesel

Re : [RESOLU] substitution sed

MicP a écrit :

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, à 18:42

diesel

Re : [RESOLU] substitution sed

pingouinux a écrit :

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. sad sad sad

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, à 18:48

diesel

Re : [RESOLU] substitution sed

pingouinux a écrit :

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, à 19:01

pingouinux

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

Hors ligne

#11 Le 17/04/2019, à 19:50

diesel

Re : [RESOLU] substitution sed

pingouinux a écrit :
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, à 20: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, à 21:03

pingouinux

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.

Dernière modification par pingouinux (Le 17/04/2019, à 21:06)

Hors ligne

#14 Le 17/04/2019, à 21:07

kamaris

Re : [RESOLU] substitution sed

Pas si il n'y a rien après le dernier / wink

Hors ligne

#15 Le 17/04/2019, à 21:35

diesel

Re : [RESOLU] substitution sed

pingouinux a écrit :
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, à 22: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, à 22:20)

Hors ligne

#17 Le 17/04/2019, à 22:35

diesel

Re : [RESOLU] substitution sed

kamaris a écrit :

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, à 22: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, à 22: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, à 22:44)


Arbiel Perlacremaz
LDLC Aurore NK3S-8-S4 Ubuntu 20.04
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