如何在Perl中解析此文件格式?

时间:2010-11-01 19:25:34

标签: perl

也许有人知道perl脚本具有非常强的不规则表达式,只匹配具有uniqe规则的行([param_name] [separator] [any_value])

EXAMPLE1和EXAMPLE2中描述的规则

脚本的目标是匹配有效行,如下所述(EXAMPLE1 - VALID行并忽略EXAMPLE2中描述的非有效行 - 非有效行)

如果有人有一个与文件和文件中的有效行匹配的精彩代码,我将很高兴  将有效行打印到/tmp/Valid.txt 并将非有效行打印到/tmp/nonvalid.txt

如何运行脚本的示例

./find_valid_lines.pl   file

定义:

有效行语法:

  

[Parameter_name] [separator] [Value]

其中:

  • Parameter_name:任何字符串。但不是数字。或以数字/ s开头的字符串
  • separator:是“=”字符(每行只有一个分隔符)
  • Value:任何字符串或数字或字符都包含例外字符             作为$ *& (_ {['“?<〜!等等

但是如果该行具有;字符,则只有在;之前的行是有效行的情况下,脚本才必须使用该行,直到;

例如:

 MY__param = 100 ; 1000

然后

 MY__param = 100 
  • 备注:如果开头
  • 中存在“#”字符,脚本将忽略该行

文件中的行示例(有效行 - example1而不是有效行 - example2)

示例1:有效行(有效参数&有效分隔符&有效值)

 parameter=1 
 parameter.1=1 2 3
 MY_Name.2= A B C
 parameter =1 * * $ @
 Home_NAME =MOON
 param1=1 2 3 + * *
 Param_A = 73826.32863
 PARAM_STAR    =   23.84 (2.d) 12 & {0} (8) 100%
 Param120A = ~1.33454656
 @param =90%
 P1= -39546
 My_param=#
 My_P = # #123
 MY_Parameter =   <34> 2 3 4 5 6 7 8 9 A "ededefec" $100
 uniq_param=?
 T = 0
 GH.@=%
 PORT_NUM= 123 / 98775 /  554 / 34545 / 54
 ADDRESS  = 172.19.0.1
 FolderHome     = /dir746/dir87/file1 , /dir746/dir87/file2
 switch_from_LAN*=100G_SPEED

示例2:非有效行(非有效参数或非有效分隔符或非有效值)

 PARAM== 100
 Param = 276 =
 276 = 2652
 = 234
 Name = 
 PARAMETER = ;
 Param_is_file 123
 port 19463
 David_name
 243546
 =
 635A
 10Param
 *&^
 = &^#$>:
 A 123
 65MY_PARAM_NAME=10
 all_strings=; 75845
 switch_from_LAN*=

1 个答案:

答案 0 :(得分:1)

这是一种方式:

#!/usr/bin/perl

use strict; use warnings;
use File::Slurp;

while ( my $line = <DATA> ) {
    my $save = $line;
    $line =~ s/\s*;.*\z//s; # ignore comments

    my ($p, $v) = map { s/^\s+//; s/\s+\z//; $_ } split /=/, $line, 2;

    if ( defined($v) and $p =~ /^[^0-9].*\z/ and $v =~ /^[^=]+\z/ ) {
        append_file 'valid.txt', \ $save;
    }
    else {
        append_file 'invalid.txt', \ $save;
    }
}

__DATA__
parameter=1
parameter.1=1 2 3
MY_Name.2= A B C
parameter =1 * * $ @
Home_NAME =MOON
param1=1 2 3 + * *
Param_A = 73826.32863
PARAM_STAR    =   23.84 (2.d) 12 & {0} (8) 100%
Param120A = ~1.33454656
@param =90%
P1= -39546
My_param=#
My_P = # #123
MY_Parameter =   <34> 2 3 4 5 6 7 8 9 A "ededefec" $100
uniq_param=?
T = 0
GH.@=%
PORT_NUM= 123 / 98775 /  554 / 34545 / 54
ADDRESS  = 172.19.0.1
PARAM== 100
Param = 276 =
276 = 2652
= 234
Name =
PARAMETER = ;
Param_is_file 123
port 19463
David_name
243546
=
635A
10Param
*&^
= &^#$>:
A 123