web-dev-qa-db-ja.com

ファイルのパスから最初のディレクトリコンポーネントを削除する

Bashの変数から1つのディレクトリ(左端)を削除する必要があります。すべてのパスを削除する方法、またはdirnameなどを使用する方法を見つけましたが、右側のすべてまたは1つのパスコンポーネントを削除していました。それは私を助けにはなりません。だからあなたは私が必要とするものをよりよく理解しているので、私は例を書きます:

私が持っています a/project/hello.ca/project/docs/README、...そして、それを削除したいa/なので、いくつかのコマンドの後でproject/hello.cおよびproject/docs/README、...

38
Libor Zapletal

次のいずれかを使用できます。

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

3つのエコーコマンドはすべてb/c/d;もちろん、この値は任意の方法で使用できます。

1つ目は、スクリプトを作成するときに削除する必要がある名前がわかっている場合に適しています。

2番目は、削除する必要があるプレフィックスを含む変数がある場合に適しています(マイナーバリアント:y=a; echo ${x#$y/})。

3番目は最も一般的なもので、最初のスラッシュまでの任意の接頭辞を削除します。 *をMacOS X 10.6.6のbash(バージョン3.2)でテストしたところ、欲張らずに動作しました-考えすぎると、Perlと正規表現の動作が多すぎます。 *シェルではスラッシュは含まれません)。

83
echo "a/project/hello.c" | sed 's,^[^/]*/,,'
5
Erik
echo a/project/hello.c | cut -d'/' -f2-
3
Neil McGill

_man expr_を見てください

expr "foo/bar/baz" : '[^/]*/\(.*\)'はあなたが望むことをします。

1
tgdavies

上記の例のどれも私の問題を解決しませんでした。 $ PATHの値を変更してswitch Java versionsを使用できるようにしたいと思っていました。グーグルして十分な回答が見つからないため、以下の独自のソリューション。

これが私の。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)
0
typelogic