文字列の検証

文字列の検証

スクリプトは、さまざまな形式の20,000以上の写真とビデオからEXIFデータを取得します。

生成日を抽出するとほとんど機能しますが、EXIFデータは記録されたデバイスと同じくらい良いもので、一部のファイルは非標準エンコーディングを使用しているため、mysqlに挿入するとエラーが発生します。例えば

"行 1 のエラー 1292(22007): 無効な日付/時刻値:gphoto行 1 の列 .. は '10 月 4 日' です。"picturesgenesis

mysql datetimeと互換性があることを確認するために、挿入する前にbashで "$genesis"変数を確認したいと思います。

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

関連情報