Удалить первые компоненты каталога из пути к файлу - PullRequest
34 голосов
/ 15 марта 2011

Мне нужно удалить один каталог (самый левый) из переменных в Bash.Я нашел способы, как я могу удалить весь путь или использовать dirname и другие, но он удалял все или один компонент пути с правой стороны;это не поможет мнеЧтобы вы лучше поняли, что мне нужно, я напишу пример:

У меня есть a/project/hello.c, a/project/docs/README, ... и я хочу удалить это a/, поэтому после некоторых командУ меня будет project/hello.c и project/docs/README, ...

Ответы [ 5 ]

79 голосов
/ 15 марта 2011

Вы можете использовать любой из:

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

Все три команды эха производят b/c/d; Конечно, вы можете использовать это значение любым удобным для вас способом.

Первый вариант подходит, когда вы знаете имя, которое необходимо удалить при написании сценария.

Второй вариант подходит, если у вас есть переменная, содержащая префикс, который нужно удалить (дополнительный вариант: y=a; echo ${x#$y/}).

Третий является наиболее общим - он удаляет любой произвольный префикс до первого слэша. Я был приятно удивлен, обнаружив, что * работал без жадности, когда я тестировал его с bash (версия 3.2) на MacOS X 10.6.6 - я отнесу это к чрезмерной работе Perl и регулярных выражений (потому что когда я думаю об этом, * в оболочке не включает косые черты).

4 голосов
/ 15 марта 2011
echo "a/project/hello.c" | sed 's,^[^/]*/,,'
1 голос
/ 21 ноября 2017
echo a/project/hello.c | cut -d'/' -f2-
1 голос
/ 15 марта 2011

Посмотрите на man expr

expr "foo/bar/baz" : '[^/]*/\(.*\)' будет делать то, что вы хотите.

0 голосов
/ 06 мая 2017

Ни один из приведенных выше примеров не решил мою проблему.Я хотел иметь возможность переключать версии Java , изменяя значение $ PATH .Погуглив и не найдя достаточного ответа, я нашел ниже собственное решение.

Вот выдержка из моего .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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...