Bash:从两端修剪参数

时间:2010-06-16 06:37:10

标签: bash parameters expansion

问候!

这是众所周知的Bash参数扩展模式:

$ {参数#word} $ {参数## word}

$ {parameter%word} $ {parameter %% word}

我需要从开头剪切一个部分,然后从参数的尾部剪切一部分。你能告诉我什么吗?

4 个答案:

答案 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并将其用作数组的索引来访问数组的倒数第二个元素。