也许有人知道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)
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
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*=
答案 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