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

Lib*_*tal 37 bash shell text-processing

我需要从Bash中的变量中删除一个目录(最左边).我找到了如何删除所有路径或使用的方法dirname,但是它删除了右侧的所有或一个路径组件; 它不会帮助我.所以你对我需要的东西有了更好的理解,我会写一个例子:

a/project/hello.c,a/project/docs/README......我想删除a/打完一些命令I'll有project/hello.cproject/docs/README,...

Jon*_*ler 82

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

x=a/b/c/d
y=a/
echo ${x#a/}
echo ${x#$y}
echo ${x#*/}
Run Code Online (Sandbox Code Playgroud)

所有三个echo命令产生b/c/d; 当然,您可以以任何方式使用该值.

当您知道编写脚本时需要删除的名称时,第一个是合适的.

当你有一个包含你需要删除的前缀的变量时,第二个是合适的(次要变体:) y=a; echo ${x#$y/}.

第三个是最通用的 - 它删除任意前缀直到第一个斜杠.*当我bash在MacOS X 10.6.6上测试它(版本3.2)时,我非常惊讶地发现它非常贪婪- 我会把它归结为过多的Perl和正则表达式的工作(因为,当我想到它时,*在shell中不包括斜杠).

  • @Pitt:[RTFM](http://www.gnu.org/software/bash/manual/bash.html#Shell-Parameter-Expansion)?哈希运算符(以'h'开头)从变量的'head'中删除东西.```后面的模式与变量的值匹配,匹配的位(如果有的话)被删除.使用`##`,删除最长的匹配.百分比运算符(尾部有't')是`#`的补码,从变量的尾部删除东西.例如,`%`可用于从文件名中删除后缀. (7认同)
  • 在这种情况下,`*`可以包含斜杠.`一个= 'ABC/def.ghi'; echo $ {a#*.}`输出"ghi"但你是对的,当你使用`#`时,它并不贪心,`##`让它变得贪婪. (3认同)

Nei*_*ill 6

echo a/project/hello.c | cut -d'/' -f2-
Run Code Online (Sandbox Code Playgroud)


Eri*_*rik 5

echo "a/project/hello.c" | sed 's,^[^/]*/,,'
Run Code Online (Sandbox Code Playgroud)