我有一个平面记录文件,每行有 33 行。我需要将此文件格式化为模板中的规格。模板为 DOS 格式,源文件为 NIX 格式。该模板具有必须遵守的特定缩进和间距。我想到了几个选择:
- BASH 与经典的 nix 工具:sed、awk、grep 等...
- BASH 与模板工具包
- Perl eith 模板工具包
- Perl
这些是按照我熟悉的顺序排列的。这是一个示例源记录(NIX 格式):
我减少了换行符的数量以节省空间(通常为 33 行):
JACKSON HOLE SANITARIUM AND REPTILE ZOO
45 GREASY HOLLER LN
JACKSON HOLE, AK 99999
Change Service Requested
BUBBA HOTEP
3 DELIVERANCE RD
MINNEAPOLIS, MN 99998
BUBBA HOTEP 09090909090909
You have a hold available for pickup as of 2012-01-04:
Title: Banjo for Fun and Profit
Author: Williams, Billy Dee
Price: $10
这是模板(DOS 格式 - 行数减少 - 通常 66 行):
<%BRANCH-NAME%>
<%BRANCH-ADDR%>
<%BRANCH-CTY%>
<%CUST-NAME%> <%BARCODE%>
You have a hold available for pickup as of <%DATE%>:
Title: <%TITLE%>
Author: <%AUTHOR%>
Price: <%PRICE%>
<%CUST-NAME%>
<%CUST-ADDR%>
<%CUST-CTY%>
end of file
它实际上确实在每条记录的末尾表示“文件结束”。
想法?我倾向于把事情过于复杂化。
UPDATE2
弄清楚了。
我的回答如下。请随意提出改进建议。
作为初学者,这里有一个提示:Perl HERE-documents(仅显示一些替换作为演示):
#!/usr/bin/perl
use strict;
use warnings;
my @lines = qw/branchname cust_name barcode bogus whatever/; # (<>);
my ($branchname, $cust_name, $barcode, undef, $whatever) = @lines;
print <<TEMPLATE;
$branchname
<%BRANCH-ADDR%>
<%BRANCH-CTY%>
$cust_name $barcode
You have a hold available for pickup as of <%DATE%>:
Title: <%TITLE%>
Author: <%AUTHOR%>
Price: <%PRICE%>
$cust_name
<%CUST-ADDR%>
<%CUST-CTY%>
end of file
TEMPLATE
将虚拟输入数组替换为从标准输入读取的行(<>)
如果你愿意的话。 (使用循环读取n
行并将其推送到数组(如果这样更有效)。我只是展示了要点,根据需要添加更多变量,并通过指定跳过输入行undef
对于“捕获”变量(如图所示)。
现在,只需将这些变量插入到您的文本中即可。
如果行尾给您带来任何痛苦,请考虑使用chomp
eg.:
my @lines = (<>); # just read em all...
my @cleaned = map { chomp } @lines;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)