2016-09-20 1 views
1

Мой входной файл имеет формат, какНужно ли перемещать шаблон в файл в другое место в том же файле, используя perl?

hidestart 
machine learning 
hideend 

rule abc { 
    hidestart 
    Keep Learning 
    hideend 
    -abc [ time=good] 
} 

rule abc1 { 
    Keep Learning 

    -abc1 [ time1=fail] 
} 


Rule “abc” { 
    hidestart 
    dp a.E_t_C1 temp –be_good NL LP -expr " (cnt(a.E_t_C1) > 0) ? expr(- (minus (pt(a.E_t_C1,ab))/at(temp)*fr/pr_1)) : 1 " <0> 1 
    hideend 
    ….. 
    -CDE [ ABC_TYPE = “temp_EOL”] 
    -CDE [ TMP_RUL = “a.E” ] 
    .. .. .. 
    -comment "keepTrying" 
} 

И я хочу, чтобы переместить hideend, которая находится внутри блока правил до конца и перед фигурными скобками. Это скрытие должно быть вставлено/перемещено только в том случае, если блок правил имеет команду hidestart. Кроме того, hidestart/hidened, который находится за пределами этого блока правил, должен быть сохранен.

Ожидаемый выход:

hidestart 
machine learning 
hideend 

rule abc { 
    hidestart 
    Keep Learning 
    -abc [ time=good] 
    hideend 
} 
rule abc1 { 
    Keep Learning 

    -abc1 [ time1=fail] 
} 

Rule “abc” { 
    hidestart 
    dp a.E_t_C1 temp –be_good NL LP -expr " (cnt(a.E_t_C1) > 0) ? expr(- (minus (pt(a.E_t_C1,ab))/at(temp)*fr/pr_1)) : 1 " <0> 1 

    ….. 
    -CDE [ ABC_TYPE = “temp_EOL”] 
    -CDE [ TMP_RUL = “a.E” ] 
    .. .. .. 
    -comment "keepTrying" 
    hideend 
} 

Мой текущий код, на самом деле удаления hideend, которая лежит за пределами блока, а также добавление hideend к блоку правила, где у меня нет hidestart. Пожалуйста, помогите мне установить ниже код

!/usr/bin/env perl 
use strict(); 
use warnings(); 
use Data::Dumper; 
my $ruleData=0; 
my $goldenData = $ARGV[0]; 
open($fopen, "< $goldenData") or die "cannot open $!"; 
while(<$fopen>) { 
if ($_ =~ /^\s*rule(.+)/gi) { 
    print "rule$1\n"; 
    while($tmp=<$fopen>) { 
    if ($tmp =~ /^\s*hideend/gi) { next; } 
    if ($tmp =~ /^\s*\}/gi) { 
     print "hideend\n$1\}\n"; 
    } else { 
     print "$tmp"; 
    } 
    } 
    close($tmp); 
} else { 
    print "$_"; 
} 
} 
close($fopen); 

Дайте мне знать, если возникнут вопросы.

Заранее спасибо.

С уважением, Divesh

+2

1) Ваш код как он не может компилироваться. Важно, чтобы вы показывали код _actual_, который дает вам проблемы. 2) Вот один из способов. Откройте два файла, один для чтения ввода другого, чтобы написать вывод. Когда вы проходите через строки ввода, пишите их на вывод. Когда вы дойдете до 'hidestart', установите флаг. Продолжать. Если вы хотите, чтобы скобка сняла флажок. Когда вы получаете 'hideend', если флаг true, не записывайте его в выходной файл. Когда вы доберетесь до закрывающей скобки, напишите 'hideend' и скобу. Отсоедините флаг. Продолжайте идти до конца. Выходной файл - это ваш результат (за исключением некоторых деталей, которые я, возможно, забыл). – zdim

ответ

0

Пожалуйста, попробуйте следующее:

#!/usr/bin/env perl 
use strict(); 
use warnings(); 
use Data::Dumper; 
my $ruleData=0; 
my $goldenData = $ARGV[0]; 
open(IN, "<$goldenData") or die "cannot open $!"; 
local $/; $_=<IN>; my $tmp=$_; 
close(IN); 

my $CurBrLoopMany = qw/((?:[^{}]*(?:{(?:[^{}]*(?:{(?:[^{}]*(?:{[^{}]*})*[^{}]*)*})*[^{}]*)*})*[^{}]*)*)/; 

my ($_pre,$_match,$_post) = ""; 
while($tmp=~m/rule([\"A-z\s]*)\{$CurBrLoopMany\}/gis) 
{ 
    $_pre = $_pre.$`; $_match = $&; $_post = $'; 
    $_match=~s/\s*hideend//g; 
    $_match=~s/\}/ hideend \n}/i; 
    $_pre = $_pre.$_match; $tmp = $_post; 
} 
if(length $_pre) { $tmp = $_pre.$_post; } 

print $tmp; 

Спасибо.

+0

Спасибо ssr1010. Этот код фактически не работает над моим фактическим файлом. Мой txt-файл также имеет двойные кавычки в строке после правила. Здесь есть образец фрагмент входного файла правила «а» { hidestart Держите Обучение hideend -abc [Времени = хорошим] } Пожалуйста, дай мне знать, если есть какие-либо вопросы. С уважением, Divesh – user3093942

+0

Я отредактировал свой ответ. – ssr1012

+0

До сих пор не работает на реальном случае Вот некоторые подробности о фактическом файле содержание Правила «а» { hidestart дпа a.E_t_C1 температуры -be_good NL LP -expr "(CNT (a.E_t_C1)> 0 ?) выражение (- (минус (пт (a.E_t_C1, аб))/(при температуре) * фр/pr_1)): 1 " hideend ... .. -CDE [ABC_TYPE =„temp_EOL“] -CDE [TMP_RUL = «ае»] .. .. .. -comment "keepTrying" } – user3093942

0

Это работает с вашим образцом. И, надеюсь, комментарии дают понять, что происходит, чтобы вы могли исправить любые проблемы, которые вы найдете.

#!/usr/bin/perl 

use strict; 
use warnings; 

my ($found_hidestart, $found_hideend); 

while (<>) { 
    # Only process within a rule block 
    if (/^rule\s+\S+\s+{/i .. /^}/) { 
    # If we find 'hidestart' remember that 
    if (/\bhidestart\b/) { 
     $found_hidestart = 1; 
    } 

    # If we find 'hideend' (and have already found 'hidestart') 
    # remember that and don't print this line. 
    if (/\bhideend\b/ && $found_hidestart) { 
     $found_hideend = 1; 
     next; # skip printing 
    } 

    # If we're at the end of a block and we've previously found 
    # both 'hidestart' and 'hideend', then print 'hideend'. 
    if (/^}/) { 
     print " hideend\n" if $found_hidestart and $found_hideend; 
     # Forget what we've previously found 
     $found_hidestart = $found_hideend = 0; 
    } 
    } 
    print; 
} 

Он написан как фильтр Unix - поэтому он считывает из STDIN и записывает в STDOUT. Это гораздо более гибко, чем открытие явных имен файлов. Если предположить, что это в файле с именем reformat, вы могли бы назвать это так:

$ ./reformat <your_existing_file> your_new_file 

Update: Я немного обновил регулярное выражение, так что имеет дело с расширенным примером.

+0

Спасибо Дэйв. К сожалению, ваш код также не работает. Я обновил образец моего входного файла в первой публикации. Попробуйте этот образец файла. – user3093942

+0

У меня уже есть. См. Мою обновленную версию. –

Смежные вопросы