【发布时间】:2011-06-16 05:46:30
【问题描述】:
我有一个充满文件的目录,其中包含以下记录:
FAKE ORGANIZATION
799 S FAKE AVE
Northern Blempglorff, RI 99xxx
01/26/2011
These items are being held for you at the location shown below each one.
IF YOU ASKED THAT MATERIAL BE MAILED TO YOU, PLEASE DISREGARD THIS NOTICE.
The Waltons. The complete DAXXXX12118198
Pickup at:CHUPACABRA LOCATION 02/02/2011
GRIMLY, WILFORD
29 FAKE LANE
S. BLEMPGLORFF RI 99XXX
我需要删除所有带有 Pickup at:CHUPACABRA LOCATION 表达式的条目。
“记录分隔符”问题: 我无法触摸输入文件的格式——它必须按原样保留。每条记录 由大约 40 多个新行分隔。
这里有一些 awk(可行):
BEGIN {
RS="\n\n\n\n\n\n\n\n\n+"
FS="\n"
}
!/CHUPACABRA/{print $0}
我对 perl 的尝试:
perl -a -F\n -ne '$/ = "\n\n\n\n\n\n\n\n\n+";$\ = "\n";chomp;$regex="CHUPACABRA";print $_ if $_ !~ m/$regex/i;' data/lib51.000
没有返回任何内容。除了命令行,我不确定如何在 perl 中指定“字段分隔符”。尝试了 a2p 实用程序——没有骰子。对于好奇的人,这是它产生的结果:
eval '$'.$1.'$2;' while $ARGV[0] =~ /^([A-Za-z
# process any FOO=bar switches
#$FS = ' '; # set field separator
$, = ' '; # set output field separator
$\ = "\n"; # set output record separator
$/ = "\n\n\n\n\n\n\n\n\n+";
$FS = "\n";
while (<>) {
chomp; # strip record separator
if (!/CHUPACABRA/) {
print $_;
}
}
这必须在某人的 Windows 机器下运行,否则我会坚持使用 awk。
谢谢!
布布诺夫
编辑(已解决)**
谢谢大佬! 这是一个(工作的)perl 脚本版本(调整后的 a2p 输出):
eval '$'.$1.'$2;' while $ARGV[0] =~ /^([A-Za-z
# process any FOO=bar switches
#$FS = ' '; # set field separator
$, = ' '; # set output field separator
$\ = "\n"; # set output record separator
$/ = "\n"x10;
$FS = "\n";
while (<>) {
chomp; # strip record separator
if (!/CHUPACABRA/) {
print $_;
}
}
随意发布改进或 CPAN 好东西,使这更惯用和/或 perl-ish。谢谢!
【问题讨论】:
-
嗯 Chupacabra ...这就是它不起作用的原因。
-
我看你认识他。山羊的毁灭者……以及最近的……perl 脚本。