2012-05-28 2 views
2

특정 문자열이 들어있는 라인을 찾기 위해 파일을 스캔하고 그 라인을 다른 파일로 인쇄하려고합니다.Bash/perl 파일에서 조건이있는 문자까지의 라인 인쇄

그러나 문자열을 포함하는 줄이 공백을 무시한 ","로 끝날 때까지 ")"문자까지 여러 줄을 인쇄해야합니다.

현재 내가 사용

$의 FUNC 내가 찾아하지만, 물론이 제한 작동하지 않습니다 문자열을 포함
for func in $fnnames 
do 
    sed/"$func"/p <$file >>$CODEBASEDIR/function_signature -n 
done 

.

이 방법이 있습니까? 현재 bash를 사용하고 있지만 펄은 괜찮습니다. 감사합니다. .

+0

일부 샘플 입력 및 예상 출력을 보여줍니다. – TLP

답변

0

귀하의 제한 사항이 정확하지 않기 때문에 까다로운 질문입니다. 당신이 말하는 - 내가 생각 - 블록은 다음과 같이해야 :

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 인쇄) 할 둘 모두와 일치하지 않는 블록 내부.

+0

불분명하지만 죄송합니다. 그렇습니다. 나는 첫 번째 사건을 의미했습니다. – Kii

0
perl -ne 'print if 1 .. /\).*,\s*$/'