我在bash脚本中使用pdftotext
,试图从PDF邮资标签中提取姓名和地址。
一个PDF文件示例:
Delivered By:
1st Class
Postage on Account GB
First Last
HouseName
Street
Town
County
Postcode
Customer Reference: 12400 / 203 1
32224983765
RETURN TO: MyName,
DoorNumber, Street, Town,
City, Postcode, Country
121-0434 905 20200-000 6190 C228
Delivered By:
1st Class
Postage on Account GB
First Last
HouseNumber
Street
Town
Postcode
Customer Reference: 12401 / 200 1
32224286536
RETURN TO: MyName,
DoorNumber, Street, Town,
City, Postcode, Country
121-0434 905 20200-000 6190 C414
请注意:
到目前为止,我刚刚得到:
pdftotext label.pdf - | grep -A10 "Postage on Account GB" | tail -n+3 | head -n -3
-
避免创建文件。grep -A10
输出匹配"Postage on Account GB"
中的前10行。tail -n+3
移除匹配项和下一行。head -n -3
移除最后3行。当文件中只有一个由6行组成的地址时,这样做很好,但是当涉及到多个地址和不同的长度时,我会陷入困境。
简单地说,我想从Postage on Account GB
之后的空行之后提取数据,直到下一行之前的空行。然后格式化输出,以便地址是逗号分隔的,并且每一个都在一个新行上,例如:
First Last, HouseName, Street, Town, County, Postcode
First Last, HouseNumber, Street, Town, Postcode
发布于 2016-09-07 00:36:14
最新答案
根据你的意见,我更新了我的答复如下:
pdftotext file.pdf - | perl -00 -wnl -e 'BEGIN{$a=$r=0} if($a){($add=$_)=~tr/\n/,/; $r=1; $a=0; next} if($r){printf "%s,%s\n",$_,$add;$r=0} $a=1 if m/Postage on Account/;'
每次通过循环读取一条记录--由于-00
,记录由上面和下面的空行分隔。在开始时,我将$a
和$r
标志设置为零,这意味着我们不查看地址或引用。如果我们正在寻找一个地址,我将所有的新行翻译成逗号,并注意到我们现在正在寻找一个参考。如果我们找到一个引用,我们打印它和保存的地址,并注意我们不再查看一个地址或一个引用。如果我们发现字符串“邮资帐户”,我们注意到,我们现在期待一个地址如下。
样本输出
Customer Reference: 12400 / 203 1,First Last,HouseName,Street,Town,County,Postcode
Customer Reference: 12401 / 200 1,First Last,HouseNumber,Street,Town,Postcode
原始答案
我想我应该在段落模式下使用Perl:
pdftotext file - | perl -00 -wnl -e 'BEGIN{$p=1} if($p==1){tr/\n/,/;print;$p=0}; $p=1 if /Postage/'
-00
将Perl设置为段落模式,将每个空行分隔块作为段落处理。BEGIN{...}
设置打印标志($p
),以便打印第一行。在随后的段落中,当设置了打印标志时,换行符将被更改为带有tr
的空格,并打印段落并重置标志。最后,每当我们看到单词Postage
,就会设置打印标志。
发布于 2016-09-06 23:59:40
pdftotext filename.pdf - |sed -n '/Postage on Account GB/,/Customer Reference:/{/Postage on Account GB/!{/Customer Reference:/!p}}' |grep . |tr '\n' ',' |sed 's/,$//g' |sed "s/Postcode/&\n/g" |sed 's/^,//g'
First Last,HouseName,Street,Town,County,Postcode
First Last,HouseNumber,Street,Town,Postcode
https://stackoverflow.com/questions/39363915
复制相似问题