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
, ...
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).
echo "a/project/hello.c" | sed 's,^[^/]*/,,'
Regardez man expr
expr "foo/bar/baz" : '[^/]*/\(.*\)'
fera ce que vous voulez.
echo a/project/hello.c | cut -d'/' -f2-
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)