我正在尝试将一个非常大的文件拆分成文件中基于字符串的较小文件。 连同我想要过滤非必需元素,通过只选择列表中所需的元素。
示例输入
Block(A_1){
Block_area : 2.6112;
Block_footprint : 3BAA5927A22E66B0AE1214A806440F12;
Block_Coordinates {
values ("0 , 0",\
"50, 50");
}
Block_connection : "North";
}
Block(BX_q_2_1){
Block_area : 2.6112;
Block_footprint : 3BAA5927A22E66B0AE1214A806440F12;
Block_Coordinates {
values ("20 , 20",\
"20, 70");
Block_connection : "South";
}
Block(C_2_r){
Block_area : 2.6112;
Block_footprint : 3BAA5927A22E66B0AE1214A806440F12;
Block_Coordinates {
values ("50 , 50",\
"10, 500");
Block_connection : "North-West";
}
输出是三个文件 grep Block_area& Block_Coordinates条目 样本输入有很多其他数据,因此我想使用正则表达式进行grep。
A_1.txt
Block(A_1){
Block_area : 2.6112;
Block_Coordinates {
values ("0 , 0",\
"50, 50");
}
}
BX_q_2_1.txt
Block(BX_q_2_1){
Block_area : 2.6112;
Block_Coordinates {
values ("20 , 20",\
"20, 70");
}
C_2_r.txt
Block(C_2_r){
Block_area : 2.6112;
Block_Coordinates {
values ("50 , 50",\
"10, 500");
}
我之前帮助分割了文件
while (<>) {
my ($file) = m|\( (.+?) \)|x or next;
open my $fh, ">", "$file.txt";
print $fh $_;
close $fh;
}
交替
while (<$in_fh>) {
open $out_fh, '>', "$1.txt" if / Block \( (\w+) \) /x;
print $out_fh $_ if $out_fh;
}
但我无法包含选择性数据。
问候
答案 0 :(得分:1)
要仅输出特定关键字,请使用以下程序:
#!/usr/bin/perl
use warnings;
use strict;
my $OUT;
while (<>) {
if (my ($filename) = /Block \( (.*?) \){/x) {
open $OUT, '>', "$filename.txt" or die $!;
}
print {$OUT} $_ if ! /Block_/ # header & inner values
or /Block_(?: area | Coordinates )/x; # keywords
}
如果您需要跳过多行条目,它不起作用。
答案 1 :(得分:0)
如果您愿意使用match
和groups
(Block\([^)]*\){(?:(?!\bBlock_connection).)*)
试试这个。这将提供所有必需的组。标记s
和g
。请参阅演示。
http://regex101.com/r/rQ6mK9/41
或
您可以按Block_connection\s+:\s+"[^"]+";\s+}
分割。
参见演示。