我的文件存储为
目录abc123.0000.pdb
abc123.0001.pdb
abc123.0002.pdb
.
.
.
abc123.0456.pdb
注意" abc123"是任意的,数字是#34; 0456"。我想我可以使用
获取最大的文件名\ls | tail -1
但我如何获得数字" 456"只有没有填充零并将其作为变量存储在bash脚本中?
答案 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.pdb
或abc123.0010.pdb
。9999
。例如,如果存在abc123.9999.pdb
和abc123.10000.pdb
,abc123.9999.pdb
可能会按ls
排序。