Enlever une partie du chemin sur Unix
Je suis en train d'essayer d'enlever une partie du chemin dans une chaîne de caractères. J'ai le chemin:
/path/to/file/drive/file/path/
Je veux supprimer la première partie /path/to/file/drive
et de produire de la sortie:
file/path/
Remarque: j'ai plusieurs chemins dans une boucle while, avec la même /path/to/file/drive
dans chacun d'eux, mais je suis juste à la recherche du "comment" sur la suppression de la chaîne souhaitée.
J'ai trouvé quelques exemples, mais je ne peux pas les faire fonctionner:
echo /path/to/file/drive/file/path/ | sed 's:/path/to/file/drive::'
echo /path/to/file/drive/file/path/ | sed 's:/path/to/file/drive:2'
\2
cours de la seconde partie de la chaîne et je suis clairement fait quelque chose de mal...peut-être il ya un moyen plus facile?
Vous devez vous connecter pour publier un commentaire.
Vous pouvez également utiliser le shell POSIX extension variable pour ce faire.
La
#..
partie enlève l'un des principaux chaîne correspondante lorsque la variable est élargi, ce qui est particulièrement utile si vos cordes sont déjà dans les variables shell, comme si vous êtes à l'aide d'unfor
boucle. Vous pouvez bande de correspondance des chaînes de caractères (par exemple, une extension) à partir de la fin d'une variable également, à l'aide de%...
. Voir labash
page de man pour les détails sanglants.sed
dans ce cas.Si vous souhaitiez supprimer un certain NOMBRE de composants de chemin, vous devez utiliser
cut
avec-d'/'
. Par exemple, sipath=/home/dude/some/deepish/dir
:De supprimer les deux premières composantes:
De garder les deux premières composantes:
Pour supprimer les deux dernières composantes (
rev
inverse de la chaîne):Pour garder les trois derniers volets:
Ou, si vous voulez tout supprimer avant qu'un composant particulier,
sed
devrait fonctionner:Ou après un élément particulier:
C'est encore plus facile si vous ne souhaitez pas conserver le composant que vous êtes en précisant:
Et si l'on veut être cohérent, vous pouvez adapter le slash de trop:
Bien sûr, si vous êtes correspondant à plusieurs coups de sabre, vous devriez passer l'
sed
délimiteur:Noter que tous ces exemples d'utiliser des chemins absolus, vous aurez à jouer autour de les faire travailler avec des chemins relatifs.
rev
truc. Va upvote lors de mon vote cap dissipe demain.Si vous ne voulez pas coder en dur la partie que vous êtes en train de retirer:
Un moyen de le faire avec sed est
À l'aide de
${path#/path/to/file/drive/}
comme suggéré par le mal otto est certainement typique de/la meilleure façon de le faire, mais comme il y a beaucoup de sed suggestions il est important de souligner que le sed est exagéré si vous travaillez avec une chaîne fixe. Vous pouvez également le faire:À jeter les 20 premiers caractères. De même, vous pouvez utiliser
${PATH:20}
en bash ou$PATH[20,-1]
dans zsh.Si vous souhaitez supprimer les N premières parties de la voie, vous pouvez bien sûr utiliser N appels à
dirname
, comme dans glenn réponse, mais c'est probablement plus facile à utiliser d'expansion:Plus précisément,
${path#*/*/*/*/*/}
signifie "retour$path
moins le plus court préfixe qui contient 5 barres obliques".Pur bash, sans codage en dur la réponse