2013-08-21 2 views
2

bash 파일 (* .sh)에서 perl을 사용하는 정규 표현식을 찾고 있습니다. 두 패턴 사이에서 동적 패턴을 찾아야합니다. 예를 들어perl bash에서 두 패턴 사이의 패턴을 찾습니다.

:

some data 
. 
. 
. 
Pattern1 
.. data 
Dynamic_Pattern 
...data 
Pattern2 
. 
. 
data 
. 
. 
Pattern1 
..data 
Pattern2 

가 출력 될 것입니다 :

Pattern1 
.. data 
dynamic pattern 
...data 
Pattern2 

나는 웹에이 코드를 발견

perl -n0e 'while (/Pattern1.*?((?=Pattern2)|(?=$))/sg) {$x=$&;print $x if $x=~/$Dynamic_Pattern/}' file 
문제는이 경우 작동하지 않는다는 것입니다

동적 인 경우에만 Dynamic_Pattern id 동적

+0

'$ Dynamic_Pattern'는 호출 bash는 스크립트에서 온다? – marderh

+0

예 펄 스크립 측면에서 Dynamic_Pattern을 초기화하기 배시 함수 '펄 -n0e'동안 (/Pattern1.*?((?=Pattern2)|(?=$))/sg) {$ X = $ &; $ x = ~/$ Dynamic_Pattern /} 'file'이면 $ x를 출력합니다. –

답변

1

perl-oneliner에 "동적"부분을 인수로 전달해야합니다. 그렇지 않으면 perl은 "his"변수로 취급합니다. 물론 이것은 정의되지 않았습니다. -s 스위치를 사용하여 기본 명령 줄 인수를 활성화 할 수 있습니다 (here). 패턴 앞의 \Q은 잠재적으로 문제가되는 문자를 인용해야합니다.

perl -sn0e 'while (/Pattern1.*?((?=Pattern2)|(?=$))/sg) {$x=$&;print $x if $x=~/\Q$dynpattern/}' -- -dynpattern="$Dynamic_Pattern" file 
+0

$ Dynamic_Pattern을 두 번 인용합니다. – choroba

+0

예, 단지'\ Q'를 앞에 두는 것에 대해 생각하고있었습니다. 내가 – marderh

+0

는 스위치의 순서를 고정하고,이'--' 인자 저장하기 전에,하지가 예상대로 작동하는 것 같다 추가 –

1

하나의 옵션은 스크립트에 두 개의 인수를 전달하는 것입니다. 첫 번째는 검색 할 동적 패턴이고 두 번째는 내용이있는 파일입니다. 스크립트는 플립 플롭을 사용하여 두 에지 패턴 사이의 선 범위를 추출합니다.

값 Assing :

searched_pattern="Dynamic_Pattern" 

을 그리고 perl 스크립트 실행

perl -ne ' 
    BEGIN { $pat = shift } 
    if (my $range = (m/\A(?i)pattern1\b/ ... m/\A(?i)pattern2\b/)) { 
     $data .= $_; 
     if ((q|E0| eq substr $range, -2) && ($data =~ m/^\Q${pat}\E\b/m)) { 
      printf qq|%s|, $data; 
     } 
     else { 
      next; 
     } 
    } 

    if ($data) { undef $data } 
' "$searched_pattern" infile 

그것은 산출 :

Pattern1 
.. data 
Dynamic_Pattern 
...data 
Pattern2 
관련 문제