web-dev-qa-db-fra.com

Supprimer les premiers composants du répertoire du chemin du fichier

Je dois supprimer un répertoire (le plus à gauche) des variables dans Bash. J'ai trouvé le moyen de supprimer tout le chemin ou d'utiliser dirname et d'autres mais cela supprimait tout ou un composant du chemin du côté droit; ça ne m'aiderait pas. Donc, vous avez une meilleure compréhension de ce dont j'ai besoin, je vais écrire un exemple:

J'ai a/project/hello.c, a/project/docs/README, ... et je veux supprimer ce a/ afin qu'après certaines commandes, je possède project/hello.c et project/docs/README, ...

34
Libor Zapletal

Vous pouvez utiliser l'un des:

x=a/b/c/d
y=a/
echo ${x#a/}
echo ${x#$y}
echo ${x#*/}

Les trois commandes echo produisent b/c/d; vous pouvez utiliser la valeur comme bon vous semble, bien entendu.

La première est appropriée lorsque vous connaissez le nom que vous devez supprimer lors de l'écriture du script.

La seconde est appropriée lorsque vous avez une variable contenant le préfixe que vous devez supprimer (variante mineure: y=a; echo ${x#$y/}).

La troisième est la plus générale - elle supprime tout préfixe arbitraire jusqu’à la première barre oblique. J'ai été agréablement surpris de constater que le * fonctionnait de manière non goulue lorsque je l'ai testé avec bash (version 3.2) sur MacOS X 10.6.6. il, * dans Shell n'inclut pas de barres obliques).

78
Jonathan Leffler
echo "a/project/hello.c" | sed 's,^[^/]*/,,'
4
Erik

Regardez man expr

expr "foo/bar/baz" : '[^/]*/\(.*\)' fera ce que vous voulez.

1
tgdavies
echo a/project/hello.c | cut -d'/' -f2-
1
Neil McGill

Aucun des exemples ci-dessus n'a résolu mon problème. Je voulais pouvoir changer de version de Java en changeant la valeur de $ PATH Après avoir recherché Google et ne trouvant pas de réponse suffisante, j'ai présenté ma propre solution ci-dessous.

Voici un extrait de mon .bashrc :

jv8() {
    export Java_HOME=/opt/jdk1.8.0_121
    y=$(echo $PATH | tr ':' '\n' |sed '/\/opt\/jdk/d' | tr '\n' ':')
    export PATH=$Java_HOME/bin:$y
}

jv6() {
    export Java_HOME=/opt/jdk1.6.0_45
    y=$(echo $PATH | tr ':' '\n' |sed '/\/opt\/jdk/d' | tr '\n' ':')
    export PATH=$Java_HOME/bin:$y
}

Donc, dans mon shell bash, je peux basculer simplement en:

$> jv6
Java -version
Java version "1.6.0_45"
Java(TM) SE Runtime Environment (build 1.6.0_45-b06)
Java HotSpot(TM) 64-Bit Server VM (build 20.45-b01, mixed mode)
$> jv8
Java -version
Java version "1.8.0_121"
Java(TM) SE Runtime Environment (build 1.8.0_121-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.121-b13, mixed mode)
0
typelogic