我正在尝试调用一个包含时间戳%Y%m%d%H%M%S
的文件,在此,如何通过排除分钟和秒来考虑直到几小时?
答案 0 :(得分:0)
有许多可能的方法来映射完整的文件名,例如:
/some/where/abc_abc_abd_abc_abc_20170914092632.txt
(其中名称包括秒组件 - 示例中为32)到没有分钟或秒(或路径前缀)的名称。
sed
假设变量持有名称为vFileName
,则可以使用:
vFile=${vFileName##*/} # Remove path prefix
vFile=${vFile%.txt} # Remove .txt suffix
vFile=$(echo "$vFile" | sed 's/_\([12][8901][0-9][0-9][01][0-9][0-3][0-9][012][0-9]\)[0-9]\{4\}$/_\1/')
这是对半日验证日期/时间字符串的相当严重的尝试;它要求一年的第一个数字是1或2;第二个是8,9,0或1(18xx,19xx,20xx,21xx),同样限制月,日,小时;然后删除(未经验证的超过"它必须是数字")分钟和秒。使用示例名称,您将$vFile
包含:
abc_abc_abd_abd_abc_2017091409
你从那里做什么取决于你。您可以使用更简单/更短的模式匹配(对其接受的内容不那么严格):
vFile=$(echo "$vFile" | sed 's/_\([0-9]\{10\}\)[0-9]\{4\}$/_\1/')
使用给定的示例数据,它会产生相同的结果。
验证更少,您可以使用以下方法从有效数据中获得相同的结果:
vFile=${vFileName##*/} # Remove path prefix
vFile=${vFile%[0-9][0-9][0-9][0-9].txt} # Remove ####.txt suffix
删除最后4位数字和.txt
后缀。由于这不涉及外部命令,因此可能是最快的。这应该适用于任何合理的POSIX兼容shell(Bash,Korn,Dash,Zsh,...)。