Bash 从文件路径中删除第一个目录组件
我需要从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
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-