Как я могу разобрать этот формат файла в Perl? - PullRequest
0 голосов
/ 01 ноября 2010

Может быть, у кого-то есть идея для сценария perl с очень сильным нерегулярным выражением, которое соответствует только строкам с уникальным правилом ([param_name] [separator] [any_value])

Правила, описанные в ПРИМЕРЕ 1 и ПРИМЕРЕ 2

Цель сценария - сопоставить допустимые строки, описанные ниже (ПРИМЕР 1 - допустимые строки и игнорировать недопустимые строки, описанные в ПРИМЕРЕ 2 - недопустимые строки)

Я буду рад, если у кого-нибудь есть блестящий код, который соответствует действительным строкам из файла и выведите действительные строки в /tmp/Valid.txt И выведите недопустимую строку в /tmp/nonvalid.txt

Пример запуска скрипта

./find_valid_lines.pl   file

Определение:

Допустимый синтаксис строки:

[Parameter_name] [separator] [Value]

, где:

  • Parameter_name: любая строка. но не номер. или строка, начинающаяся с номера / s
  • separator: - это символ "=" (только один разделитель в каждой строке)
  • Value: любая строка, число или символ, включая исключительные символы как $ * & (_ {['"? <~! и т. д. </li>

Но если строка имеет символ ;, сценарий должен занимать строку до ;, только если строка перед ; является допустимой строкой.

Например:

 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 Ответ

1 голос
/ 01 ноября 2010

Вот один из способов:

#!/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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...