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-