0

スキャンしたドキュメントの名前付けとデータベースへの「添付」を自動化するために最終的に使用したいbashシェルスクリプトを作成しています。スクリプト OCR は、pdf の最初のページのセクションであり、3 行を含むテキスト ファイルを出力します。名前、一意の ID、および日時文字列:

ジョン・スミス
事件番号:
234567 ( ) 2013/09/04 11:34 AM

私がやりたいことは、変数として"Smith, John""234567" という2 つの別々の文字列になることです。この番号を抽出するために sed/awk/etc で正規表現を使用する方法を探しています。1 つの問題は、OCR が次のような文字列をほとんど出力しないことです。

"Case #2 234567 ( )"  

また

"Ca$e # 2234567 ( 7"  

したがって、文字列の最後の 6 桁のみを取得することを考えています。これは、最後の 6 桁が誤って読み取られるのは、おそらく 10,000 分の 1 にすぎないからです。この一意の ID は 6 桁のみで、常に 200000 ~ 999999 の間です。私は正規表現を学んでいますが、遅いです。どんな助けでも大歓迎です。

編集:
今のところ私は使用しています:

casename="$(cat test.txt | sed '1!d')"
casenum="$(cat test.txt | sed -n -r 's/.*([0-9]{6}).*/\1/p')"
echo ${casenum} ${casename}
234567 Smith, John

なぜこれが良い方法ではないのか、または改善できる点についての意見は (非常に) 歓迎されます。

4

3 に答える 3

0

おそらく、次のようなテストされていないが、構文的には有効なスニペットを使用できます。

shopt -s extglob
declare -a cases
for casefile in casefiles/*
do
 name=""
 while read l
 do
  if [[ -z "$name" ]]
  then
   [[ "$l" == @(*, *) ]] && name=$l
  elif [[ "$l" == +([0-9]) ]]
  then
   after=${l#*[2-9][0-9][0-9][0-9][0-9][0-9]}
   l=${l%$after}
   l=${l#${l%[2-9][0-9][0-9][0-9][0-9][0-9]}}
   if [[ "$l" == @([2-9][0-9][0-9][0-9][0-9][0-9]) ]]
   then
    cases[$l]=$name
   fi
   name=""
  fi
 done < $casefile
done

「ハード部分」は、範囲内の最初の 6 桁の数字とそれ以降のすべてを削除し、残っているもの (数字の前のもの) を行から削除します。次に、文字列の先頭から数字を削除し、末尾から残っているもの (数字の後の部分) を削除します。残っているものが範囲内の 6 桁の数字である場合、それをインデックスとして使用し、ケース名を配列内の値として使用します。これを後で反復処理できます。

残りはかなり簡単です。:) これが期待どおりに機能しない場合、私は主に bash ではなく ksh を使用しているという事実を非難します。;)

于 2013-09-04T23:54:20.313 に答える
0

2 行目に次の正規表現を使用できます。

^.*(\d{6})[^\d].*$

ここで、最初に名前が付けられたサブグループは、対象の数字を示します。

たとえば、メモ帳++を使用すると、

  1. 元のテキスト:ここに画像の説明を入力

  2. 置換オプション:ここに画像の説明を入力

  3. 結果のテキスト:ここに画像の説明を入力

正規表現は、環境全体で多かれ少なかれ同じままである必要があります。$1名前付き部分式 (ここ)の参照方法を単純に変更する必要がある場合があります。

于 2013-09-04T17:35:09.023 に答える