我正在编写一个bash shell脚本,我希望最终可以使用它来自动命名和附加'扫描文件到我们的数据库。脚本OCR是pdf第一页的一部分,输出一个包含三行的文本文件;名称,唯一ID和日期时间字符串:
史密斯,约翰 案例编号:234567()我想做的最终是两个单独的字符串作为变量," 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
为什么这可能不是一个好方法,或者可以改进的任何输入是(非常)欢迎。
答案 0 :(得分:0)
您可以在第二行使用以下正则表达式:
^.*(\d{6})[^\d].*$
此处,第一个命名的子组将表示感兴趣的数字。
例如,使用Notepad ++,
原始文字:
替换选项:
生成的文字:
正则表达式应该在不同环境中保持相同或更低。您可能只需要更改引用的命名子表达式($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。 ;)