0

我正在编写一个 bash shell 脚本,我希望最终可以使用它来自动命名扫描文档并将其“附加”到我们的数据库。脚本 OCR 是 pdf 第一页的一部分,并输出一个包含三行的文本文件;名称、唯一 ID 和日期时间字符串:

Smith, John
案例编号:234567 ( ) 2013 年 9
月 4 日上午 11:34

我想要做的是最终得到两个单独的字符串作为变量,"Smith, John""234567"。我正在寻求使用 sed/awk/etc 的正则表达式来提取此数字的帮助。一个问题是 OCR 很少会输出如下字符串:

"Case #2 234567 ( )"  

或者

"Ca$e # 2234567 ( 7"  

因此,我正在考虑获取字符串中唯一的最后 6 位数字,因为其中只有 10,000 多个中可能只有 1 个错误地读取了最后 6 位数字。这个唯一的 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 位数字,它会将其用作索引,并将案例名称用作数组中的值,您可以稍后对其进行迭代。

其余的应该很简单。:) 如果这没有按预期工作,我责怪我主要使用 ksh,而不是 bash。;)

于 2013-09-04T23:54:20.313 回答
0

您可以对第二行使用以下正则表达式:

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

在这里,第一个命名的子组将表示感兴趣的数字。

例如,使用记事本++,

  1. 原文:在此处输入图像描述

  2. 替换选项:在此处输入图像描述

  3. 结果文本:在此处输入图像描述

正则表达式应该在不同环境中保持或多或少相同。您可能需要简单地更改$1引用命名子表达式(此处)的方式。

于 2013-09-04T17:35:09.023 回答
0

你可以试试这个正则表达式(BRE):

[2-9][0-9]\{5\}\>
于 2013-09-04T17:51:50.033 回答