Bash 从文件路径中删除第一个目录组件

Bash 从文件路径中删除第一个目录组件,bash,shell,text-processing,Bash,Shell,Text Processing,我需要从Bash中的变量中删除一个目录(最左边的)。我找到了删除所有路径或使用dirname和其他路径的方法,但它删除了右侧的所有或一个路径组件;这对我没有帮助。为了让您更好地理解我的需求,我将写一个示例: 我有a/project/hello.c,a/project/docs/README。。。我想删除a/,因此在执行一些命令后,我将拥有project/hello.c和project/docs/README,…您可以使用以下任何一种: echo "a/project/hello.c" | sed

我需要从Bash中的变量中删除一个目录(最左边的)。我找到了删除所有路径或使用
dirname
和其他路径的方法,但它删除了右侧的所有或一个路径组件;这对我没有帮助。为了让您更好地理解我的需求,我将写一个示例:

我有
a/project/hello.c
a/project/docs/README
。。。我想删除
a/
,因此在执行一些命令后,我将拥有
project/hello.c
project/docs/README
,…

您可以使用以下任何一种:

echo "a/project/hello.c" | sed 's,^[^/]*/,,'
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上用
bash
(3.2版)测试
*
时,我惊喜地发现它工作得并不好——我将这归因于Perl和regex做了太多的工作(因为,当我想到它时,
*
在shell中不包括斜杠)。

看看
man expr


expr“foo/bar/baz”:“[^/]*/\(.*\)”
会做你想做的事。

上面的例子都不能解决我的问题。我想通过更改$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)

您可以通过管道连接到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”

在该上下文中,
*
可以包含斜杠<代码>a='abc/def.ghi';echo${a#*.}输出“ghi”,但你是对的,当你使用
时它并不贪婪,
#
使它贪婪。
#
操作符实际做什么?@Pitt:?散列运算符(以“h”开头)从变量的“head”中删除内容。
#
后的模式与变量值匹配,匹配的位(如果有)被删除。使用
##
,将删除最长的匹配项。百分比运算符(尾部有一个“t”)是
#
的补码,从变量尾部删除内容。
%
可以用来删除文件名中的后缀,例如。@JonathanLeffler:Cheers:)再次了解了bash!当将此应用于数组时,我惊讶地发现“${array[@]/\*\/}”是贪婪的,而“${array[@]/\\\\/}”什么都不做。我喜欢这样,它简单且易于推广。我有一个类似的问题,我所需要做的就是为我的案例将-f2-中的数字增加到-f5-中。对其他解决方案中给出的正则表达式执行同样的操作要困难得多。
echo a/project/hello.c | cut -d'/' -f2-