84 votes

Supprimer une partie du chemin sous Unix

J'essaie de supprimer une partie du chemin dans une chaîne de caractères. J'ai le chemin :

/path/to/file/drive/file/path/

Je souhaite supprimer la première partie /path/to/file/drive et produire le résultat :

file/path/

Note : J'ai plusieurs chemins dans une boucle while, avec le même /path/to/file/drive dans chacun d'entre eux, mais je cherche simplement le "comment faire" pour supprimer la chaîne souhaitée.

J'ai trouvé quelques exemples, mais je n'arrive pas à les faire fonctionner :

echo /path/to/file/drive/file/path/ | sed 's:/path/to/file/drive:\2:'
echo /path/to/file/drive/file/path/ | sed 's:/path/to/file/drive:2'

\2 étant la deuxième partie de la chaîne, il est clair que je fais quelque chose de mal... Peut-être y a-t-il un moyen plus simple ?

4voto

William Pursell Points 56211

Utilisation ${path#/path/to/file/drive/} comme suggéré par evil otto est certainement la meilleure façon de le faire, mais puisqu'il y a de nombreuses suggestions de sed, il vaut la peine de souligner que sed est inutile si vous travaillez avec une chaîne de caractères fixe. Vous pouvez aussi faire :

echo $PATH | cut -b 21-

Pour rejeter les 20 premiers caractères. De même, vous pouvez utiliser ${PATH:20} en bash ou $PATH[20,-1] dans zsh.

1voto

Andy Points 1607

Purement bash, sans codage en dur de la réponse

basenames()
{
  local d="${2}"
  for ((x=0; x<"${1}"; x++)); do
    d="${d%/*}"
  done
  echo "${2#"${d}"/}"
}
  • Argument 1 - Combien de niveaux souhaitez-vous conserver (2 dans la question initiale) ?
  • Argument 2 - Le chemin complet

Tiré de vsi_common ( version originale )

0voto

itsmisterbrown Points 41

Voici une solution utilisant une syntaxe bash simple qui prend en compte les variables (au cas où vous ne voudriez pas coder en dur des chemins d'accès complets), supprime la nécessité d'acheminer stdin à sed et comprend un for une boucle, pour faire bonne mesure :

FULLPATH="/path/to/file/drive/file/path/"
SUBPATH="/path/to/file/drive/"
for i in $FULLPATH;
do
echo ${i#$SUBPATH}
done

comme mentionné ci-dessus par @evil otto, le # est utilisé pour supprimer un préfixe dans ce scénario.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X