2013-12-18 116 views
3

这个问题可能已经被问到,但我不知道如何把它写好。我是新来的bash脚本...如何在Bash中获得文件名的通配符部分

假设我有一个目录一堆文件具有类似名称:

file1_pre.ext 
file2_pre.ext 
file3_pre.ext 
different_tmp.ext 

我可以使用使用通配符来筛选感兴趣的文件:

for f in *_pre.ext 
do 
    echo $f 
done 

但我怎么解析/提取前缀,这样我可以得到弦file1file2等作为文件名别的东西来使用?

回答

3

${f%_pre.ext}将展开为f的值,最后的_pre.ext被删除。

有几种字符串操作可以在${varname<SomeOperator>args}的参数扩展中完成。 %运算符删除尾随字符串。它需要一个通配符参数,因此您可以使用${f%_*}之类的操作来删除下划线后的所有内容。如果您将%加倍,如${f%%_*},则会删除最长匹配,因此您会在第一个下划线后杀死所有东西。单个的%确实是最短的匹配,所以它将删除最后一个下划线后的所有内容。由于我们正在寻找完全匹配,因此使用%_pre.ext并没有什么不同。

###运营商类似于%%%但工作在字符串的开始而不是结束。

另一个常用的示例是:-运算符,如果该变量为空,则该运算符将替换默认值。

此外,${foo}没有运营商的写作$foo的另一种方法,但可以帮助你,有时,当你想立即把一些文字变量的值之后:

echo $foobar # oops, looks for variable called "foobar" 
echo ${foo}bar # the value of variable "foo" then literal "bar" 

有关完整列表,请参阅任何shell手册页的“参数扩展”部分。

+1

@mrKelley请参阅http://tldp.org/LDP/abs/html/abs-guide.html#AEN22568。缺点是:要对一个变量值执行操作(或者通常,为了使变量引用在视觉上更加独特),将其名称放在'{}'中;在这种情况下,应用'%'等操作,在这种情况下,它会从变量值的* back *中去掉'_pre.ext'。 – mklement0

+0

感谢您的解释!这正是我所需要的。 – mrKelley

+0

添加了一些一般背景信息... –

相关问题