Tu peux utiliser sed pour cela.
Ce que tu veux faire au premier niveau :
/home/toto/desktop => /home/toto/ |
c'est à dire remplacer /desktop par /
au second niveau :
/home/toto/desktop => /home/ |
c'est à dire remplacer /toto/desktop par /
au troisième niveau :
c'est à dire remplacer /home/toto/desktop par /
Bref au niveau n on remplace les n derniers /toto par /
/toto ça s'écrit avec des expressions régulières :
/ => le caractère /
[^/]* => n'importe quel caractère qui n'est PAS /, une ou plusieurs fois de suite
Donc /[^/]*
/toto/tutu/titi... n fois, c'est pas très dur en repartant du truc précédent :
(/[^/]*){n} : en noir l'expression précédente pour /toto, en bleu le côté 'n fois'
Les n derniers /toto/tutu ça s'écrit (en repartant encore du truc précédent) :
(/[^/]*){n}$ : le $ est une ancre présente à la fin de la chaine de caractère. Ainsi on doit trouver "/toto n fois" (en noir) puis la fin de chaine.
Soit au final (/[^/]*){n}$
Maintenant la syntaxe de sed :
echo "chaine de caractères" | sed 's_ancien truc_nouveau truc_' |
Le nouveau truc c'est / (cf. plus haut, à chaque niveau on remplace par /)
L'ancien c'est l'expression pour les n derniers /toto/tutu, sauf que pour tout foutre dans sed, on doit utiliser \( au lieu de ( et \{ au lieu de {
C'est (encore) moins lisible du coup
Au final :
$ echo "/home/toto/desktop" | sed 's_\(/[^/]*\)\{1\}$_/_' /home/toto/ $ echo "/home/toto/desktop" | sed 's_\(/[^/]*\)\{2\}$_/_' /home/ $ echo "/home/toto/desktop" | sed 's_\(/[^/]*\)\{3\}$_/_' / |
Bref tout ça pour dire que si tu ne connais pas les expressions régulières c'est pas simple en une ligne je pense
---------------
Il y a autant d'atomes d'oxygène dans une molécule d'eau que d'étoiles dans le système solaire.