【问题标题】:Extract a numeric substring and another line as variables from multi-line text file从多行文本文件中提取数字子字符串和另一行作为变量
【发布时间】:2013-09-04 17:30:35
【问题描述】:

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

史密斯,约翰
案例编号:234567 ( )
2013 年 9 月 4 日上午 11:34

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

"Case #2 234567 ( )"  

"Ca$e # 2234567 ( 7"  

因此,我正在考虑获取字符串中唯一的最后 6 位数字,因为其中可能只有 10,000 多个数字中的最后 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

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

【问题讨论】:

    标签: regex bash sed awk ocr


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      例如,使用记事本++,

      1. 原文:

      2. 替换选项:

      3. 结果文本:

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

      【讨论】:

        【解决方案3】:

        您可能会使用类似这样的未经测试但在语法上有些有效的 sn-p:

        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。 ;)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-06-27
          • 2017-08-24
          • 2014-09-23
          • 1970-01-01
          • 2011-10-09
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多