Bash: удалить первый компонент каталога из переменной (путь к файлу)
Мне нужно удалить один каталог (самый левый) из переменных в Bash. Я нашел способы, как удалить весь путь или использовать dirname
и другие, но он удаляет все или один компонент пути с правой стороны; это не помогло бы мне. Итак, у вас есть лучшее понимание того, что мне нужно, я напишу пример:
У меня есть a/project/hello.c
, a/project/docs/README
,... и я хочу удалить это a/
, поэтому после некоторых команд у меня будут project/hello.c
и project/docs/README
,...
Ответы
Ответ 1
Вы можете использовать любой из:
x=a/b/c/d
y=a/
echo ${x#a/}
echo ${x#$y}
echo ${x#*/}
Все три команды эха создают b/c/d
; вы можете использовать значение любым способом, который вы выбираете, конечно.
Первое удобно, когда вы знаете имя, которое нужно удалить при записи script.
Вторая применима, когда у вас есть переменная, содержащая префикс, который нужно удалить (младший вариант: y=a; echo ${x#$y/}
).
Третий - самый общий - он удаляет любой произвольный префикс до первой косой черты. Я был приятно удивлен, обнаружив, что *
работал без жадности, когда я тестировал его с помощью bash
(версия 3.2) на MacOS X 10.6.6. Я положу это на слишком много работы Perl и regex (потому что, когда я думаю об этом, *
в оболочке не содержит слэшей).
Ответ 2
echo "a/project/hello.c" | sed 's,^[^/]*/,,'
Ответ 3
Посмотрите man expr
expr "foo/bar/baz" : '[^/]*/\(.*\)'
сделает то, что вы хотите.
Ответ 4
Ни один из приведенных выше примеров не решил мою проблему. Я хотел иметь возможность переключать версии Java, изменяя значение $PATH. После поиска в Google и не нахожу достаточного ответа, я сплел свое решение ниже.
Вот выдержка в моем .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
}
Итак, в моей оболочке bash я могу переключаться просто:
$> 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)
Ответ 5
echo a/project/hello.c | cut -d'/' -f2-