问候!
这是众所周知的Bash参数扩展模式:
$ {参数#word} , $ {参数## word}
和
$ {parameter%word} , $ {parameter %% word}
我需要从开头剪切一个部分,然后从参数的尾部剪切一部分。你能告诉我什么吗?
答案 0 :(得分:1)
如果您使用的是Bash版本> = 3.2,则可以使用与捕获组匹配的正则表达式来检索一个命令中的值:
$ path='/xxx/yyy/zzz/ABC/abc.txt'
$ [[ $path =~ ^.*/([^/]*)/.*$ ]]
$ echo ${BASH_REMATCH[1]}
ABC
这相当于:
$ path='/xxx/yyy/zzz/ABC/abc.txt'
$ path=$(echo "$path" | sed 's|^.*/\([^/]*\)/.*$|\1|p')
$ echo $path
ABC
答案 1 :(得分:0)
我不知道有一种简单的方法可以在不使用子壳的情况下执行此操作,这可能是为了提高效率而避免的。我会用:
> xx=hello_there
> yy=${xx#he}
> zz=${yy%re}
> echo ${zz}
llo_the
如果你对效率没有兴趣,只想要一个单行:
> zz=$(echo ${xx%re} | sed 's/^he//')
> echo ${zz}
llo_the
请记住,第二种方法会启动子shell - 如果您的脚本必须快速运行,那么我不会做很多事情。
答案 2 :(得分:0)
此解决方案使用了Andrey要求的内容,并且不使用任何外部工具。策略:使用%参数扩展删除文件名,然后使用##删除除最后一个目录之外的所有目录:
$ path=/path/to/my/last_dir/filename.txt
$ dir=${path%/*}
$ echo $dir
/path/to/my/last_dir
$ dir=${dir##*/}
$ echo $dir
last_dir
答案 3 :(得分:0)
我强烈建议使用bash数组,因为它们的性能比正则表达式匹配快3倍。
$ path='/xxx/yyy/zzz/ABC/abc.txt'
$ IFS='/' arr=( $path )
$ echo ${arr[${#arr[@]}-2]}
ABC
这可以告诉bash,数组的每个元素都由正斜杠/
通过IFS='/'
分隔。我们首先通过${#arr[@]}
确定数组中有多少元素然后减去2并将其用作数组的索引来访问数组的倒数第二个元素。