귀하의 제한 사항이 정확하지 않기 때문에 까다로운 질문입니다. 당신이 말하는 - 내가 생각 - 블록은 다음과 같이해야 :
foo
foo,
bar,
baz)
이 블록을 시작하고 괄호를 닫으면를 종료 문자열입니다.
foo bar baz) xxxxxxxxxxx,
을 그리고 라인이 쉼표로 끝나는 경우에만, foo bar baz)
말을하는 것입니다 )
까지 인쇄 할 그러나, 당신은 또한 말을 할 수있다.
당신은 도 쉼표로 끝나는 경우에만 라인을 계속해야한다고 말하는 수 :
foo, # print + is continued
bar # print + is not continued
xxxxx # ignored line
foo # print + is not continued
foo,
bar,
baz) # closing parens also end block
난 단지 당신이 첫 번째 대안을 의미하는 것으로 추측 할 수 있기 때문에, 나는 당신에게 두 가지 옵션을 제공 :
use strict;
use warnings;
sub flip {
while (<DATA>) {
print if /^foo/ .. /\)\s*$/;
}
}
sub ifchain {
my ($foo, $print);
while (<DATA>) {
if (/^foo/) {
$foo = 1; # start block
print;
} elsif ($foo) {
if (/,\s*$/) {
print;
} elsif (/\)\s*$/) {
$foo = 0; # end block
print;
}
# for catching input errors:
else { chomp; warn "Mismatched line '$_'" }
}
}
}
__DATA__
foo1,
bar,
baz)
sadsdasdasdasd,
asda
adaffssd
foo2,
two,
three)
yada
첫 번째 foo
로 시작하는 라인과 )
로 끝나는 라인 사이에 발견 된 라인을 인쇄합니다. "쉼표로 줄 끝"제한을 무시합니다. 양 측면에서, 이것은 하나의 라이너로 단순화 될 수있다 :
perl -ne 'print if /^foo/ .. /\)\s*$/' file.txt
두번째는 그냥 단순한 경우 구조 모두 제한 사항을 고려하고,이 광고를 발견하면 경고 (STDERR 인쇄) 할 둘 모두와 일치하지 않는 블록 내부.
출처
2012-05-29 00:45:14
TLP
일부 샘플 입력 및 예상 출력을 보여줍니다. – TLP