从多行文本文件中提取数字子字符串和另一行作为变量

时间:2013-09-04 17:30:35

标签: regex bash sed awk ocr

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

史密斯,约翰 案例编号:234567()
09/04/2013 11:34 AM

我想做的最终是两个单独的字符串作为变量," Smith,John" " 234567&#34 ; 即可。我正在使用带有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

为什么这可能不是一个好方法,或者可以改进的任何输入是(非常)欢迎。

3 个答案:

答案 0 :(得分:0)

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

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

此处,第一个命名的子组将表示感兴趣的数字。

例如,使用Notepad ++,

  1. 原始文字:enter image description here

  2. 替换选项:enter image description here

  3. 生成的文字:enter image description here

  4. 正则表达式应该在不同环境中保持相同或更低。您可能只需要更改引用的命名子表达式($1)的方式。

答案 1 :(得分:0)

您可以尝试使用此正则表达式(BRE):

[2-9][0-9]\{5\}\>

答案 2 :(得分: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。 ;)