我需要从Bash中的变量中删除一个目录(最左边)。我找到了如何删除所有路径或使用dirname
和其他路径的方法,但它删除了右侧的所有或一个路径组件;它不会帮助我。所以你对我需要的东西有了更好的理解,我会写一个例子:
我有a/project/hello.c
,a/project/docs/README
,...我想删除a/
,所以在一些命令之后我会project/hello.c
和project/docs/README
,...
答案 0 :(得分:79)
您可以使用以下任何一项:
x=a/b/c/d
y=a/
echo ${x#a/}
echo ${x#$y}
echo ${x#*/}
所有三个echo命令都会产生b/c/d
;当然,您可以以任何方式使用该值。
当你知道编写脚本时需要删除的名称时,第一个是合适的。
如果您的变量包含需要删除的前缀(次要变体:y=a; echo ${x#$y/}
),则第二个是合适的。
第三个是最通用的 - 它删除任意前缀直到第一个斜杠。当我在MacOS X 10.6.6上使用*
(版本3.2)进行测试时,我感到非常惊讶地发现bash
非贪婪地工作 - 我会把它归结为过多的Perl和regex工作(因为,当我考虑它时,shell中的*
不包括斜杠。)
答案 1 :(得分:4)
echo "a/project/hello.c" | sed 's,^[^/]*/,,'
答案 2 :(得分:1)
查看man expr
expr "foo/bar/baz" : '[^/]*/\(.*\)'
会做你想做的事。
答案 3 :(得分:1)
echo a/project/hello.c | cut -d'/' -f2-
答案 4 :(得分:0)
上述例子都没有解决我的问题。我想通过更改 $ PATH 值来切换java版本。谷歌搜索后找不到足够的答案,我在下面编写了自己的解决方案。
以下是 .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 shell中,我可以简单地切换:
$> 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 :(得分:0)
您可以通过管道传输到 xargs 并进行新的替换
我如何使用它将 ts-src 下目录中的所有文件从 ts 重命名为 js,将 tsx 重命名为 jsx 到相同的子目录。
find ts-src/ -type f -not -name "*.tsx" -not -name "*.ts" \
-exec bash -c 'echo "${0##*/}" "${0##ts-src/}" "$0"' {} \; | \
xargs -l bash -c 'echo mkdir -p "src/${1%$0}" && echo cp "$2" "src/$0"'