从filename获取数字,删除填充的零并存储为变量

时间:2016-12-11 19:03:55

标签: bash

我的文件存储为

目录
abc123.0000.pdb
abc123.0001.pdb
abc123.0002.pdb
.
.
.
abc123.0456.pdb

注意" abc123"是任意的,数字是#34; 0456"。我想我可以使用

获取最大的文件名
\ls | tail -1

但我如何获得数字" 456"只有没有填充零并将其作为变量存储在bash脚本中?

2 个答案:

答案 0 :(得分:0)

试试这个:

abc123.0000.pdb
regex='^[^.]*.0*([0-9]+).pdb'
for f in ./*; do
    [[ $f =~ $regex ]]
    echo "for file $f: ${BASH_REMATCH[1]}"
done

答案 1 :(得分:0)

awk是一个很好的工具:

ls | awk '
{
  if(match($0, /^.*\.0*([0-9]+)\.pdb$/, a)) {
    if(max <= a[1]) {
      max = a[1]
    }
  }
}END{
  print max
}'

输入的每一行(在本例中来自ls)通过正则表达式/^.*\.0*([0-9]+)\.pdb$/运行,该正则表达式..pdb之后和{{}之前直接匹配任何数字(不带前导零) {1}}扩展名。您查看explanation of the regex here。如果匹配成功,则该号码设置为a[1]并与max进行比较。最后,打印出最大的数字,如果没有找到匹配则没有。

这也可以在一行中运行:

ls | awk '{if(match($0,/^.*\.0*([0-9]+)\.pdb$/,a)){if(max<=a[1]){max=a[1]}}}END{print max}'

这比ls | tail -1 | egrep -o [1-9]+ | tail -1的解决方案更强大,如果出现以下情况,则会失败:

  • z.txt等文件添加到目录中。
  • 最后一个文件的数字中间或末尾有0,例如abc123.0101.pdbabc123.0010.pdb
  • 数字高于9999。例如,如果存在abc123.9999.pdbabc123.10000.pdbabc123.9999.pdb可能会按ls排序。