检查字符串有效性

检查字符串有效性

在一个脚本中,我从 20000 多张各种格式的照片和视频中获取 exifdata。

当我提取创建日期时,它在大多数情况下都有效,但是 exif 数据与写入它的设备一样好,并且某些文件使用非标准编码,因此在插入 mysql 时,我最终会遇到一些错误,例如

“第 1 行出现错误 1292 (22007):日期时间值不正确:第 1行的列gphoto..为“10 月 4 日””picturesgenesis

我想在插入之前检查 bash 中的“$genesis”变量以确保它与 mysql 日期时间兼容。

if [[ "$genesis" "isinformat" "2020-11-30 11:01:45" ]]; then sqlstuff...; fi

我在想用正则表达式 grep 可能是一种有效的方法,比如

if [[ "$(echo "$genesis"|grep '^???$')" != "" ]]; then ... fi

但我想知道

  • 正则表达式可能是什么
  • 我是否必须通过管道传输,或者可以在不产生额外进程的情况下完成它吗?
  • 也许有一个特定的预构建函数?

多谢!

答案1

"^[0-9][0-9][0-9][0-9]\-[0-9][0-9]\-[0-9][0-9]\ [0-9][0-9]\:[0-9][0-9]\:[0-9][0-9]$"

似乎可以作为 grep 正则表达式来实现我的目的,但可能有更干净的方法

正如thanasisp所指出的,这不会捕获不可能的日期,因此使用 date -d 进行测试

if [[ ! $(date -d $(echo "2015:12:12"|sed -e 's!:!/!g')) ]] &>/dev/null ; then echo "not right"; fi

失败的方式不同,因为它也可能接受一些时间:如果通过“12:04:15”,它接受的也是有效的......这导致我找到了日期检查的最终解决方案:

if [[ ! $(date -d $(echo "12:04:15"|sed -e 's!:!/!g')) ]] || [[ ! "12:04:15" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]] &>/dev/null ; then echo "not right"; fi

在上下文中给出:

mmedia=thispic.jpg
eexifdata=($(exiftool -f -n -p '$GPSLatitude,$GPSLongitude,$CreateDate,$ModifyDate' $mmedia 2>/dev/null|sed -e 's/,/ /g' -e 's!/!:!g'))
if  [[ ! $(date -d $(echo "${eexifdata[2]}"|sed -e 's!:!/!g')) ]] || [[ ! "${eexifdata[2]}" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]] &>/dev/null ; then # if date format is not acceptable
    eexifdata[2]="${eexifdata[3]}";eexifdata[3]="${eexifdata[4]}"; # then swap one position (exif is weird sometimes)
    if  [[ ! $(date -d $(echo "${eexifdata[2]}"|sed -e 's!:!/!g')) ]] || [[ ! "${eexifdata[2]}" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]] &>/dev/null ; then # if issue persists
        eexifdata[2]="$(date +%Y:%m:%d)" # set current date
        eexifdata[3]="$(date +%H:%M:%S)" # set current time
    fi
fi

相关内容