범위 패턴의 특정 항목을 인쇄하는 방법은 무엇입니까?

범위 패턴의 특정 항목을 인쇄하는 방법은 무엇입니까?

다소 특별한 형식의 문자열에서 여러 데이터 필드를 추출하려고 합니다.

각 문자열의 형식은 다음과 유사합니다(강조를 위해 공백이 추가됨).

1 abcd 2 1 efg 2 hij 3 klmnopqrs 5 tuv 6 5 wxyzäüö 6

각 숫자는 다른 필드 구분 기호를 나타냅니다. 이것이 내가 추출하려는 내용입니다.

  abcd           hij   klmnopqrs 5 tuv 6   wxyz 

어떤 경우에는 1..2및 패턴이 한 번만 나타납니다. 범위는 이전에만 나타납니다. 범위는 에만 나타납니다.5..61..235..63

지금까지 다음 코드를 성공적으로 추출 abcd하고 사용했습니다.hij

  • abcd:

    echo "$STRING" | awk 'BEGIN{ RS="2"}{gsub(/.*1/,"");print;exit}'
    
  • hij:

    echo "$STRING" | awk 'BEGIN{ RS="3"}{gsub(/.*2/,"");print;exit}'
    

wxyz이제 합계를 구할 방법을 찾고 있습니다 klmnopqrs.

  • wxyz상위 4개문자마지막 5..6문자열 범위 패턴
  • klmnopqrs에 의해첫 번째발생 3마지막일어난5

한 시간 동안 온라인으로 검색한 끝에 이제 어찌할 바를 모르겠습니다. 이러한 범위 패턴을 추출하는 방법을 찾을 수 있다면 매우 감사하겠습니다.

편집하다: 다음은 현실에 더 가까운 몇 가지 입력 예입니다.

(test)(te st) tesst. test test test test [teest] [teseeet]
(teeeest)(te st) tst. tet test [teseet]
(tst) tst. tet test [tseeet]

각 경우에 내가 추출하고 싶은 내용은 다음과 같습니다.

 test         tesst  test test test test [teest] tese
 teeeest         tst  tet test tese
 tst  tst  tet test  tsee

보시다시피 필드 구분 기호는 특수 문자입니다. 문자열의 너비와 범위 1..25..6(여기 (..)[..])는 가변적입니다.

답변1

echo "1 abcd 2 1 efg 2 hij 3 klmnopqrs 5 tuv 6 5 wxyzäüö 6" | 
perl -lne '
    @out = ();
    /1 (.+?) 2/                 and push @out, $1;
    /.+2 \K(.+?) 3 (.+?)(?= 5)/ and push @out, $1, $2;
    /(5.+?6)/                   and push @out, $1;
    /.+5 (....)/                and push @out, $1;
    print join " ", @out
'
abcd hij klmnopqrs 5 tuv 6 wxyz

정규식 특수 문자를 적절하게 이스케이프 처리하려면 주의가 필요합니다.

perl -lne '
    @out = ();
    /\((.+?)\)/                 and push @out, $1;
    /.+\) \K(.+?)\.(.+)(?= \[)/ and push @out, $1, $2;
    /.+\[(....)/                and push @out, $1;
    print join " ", @out
' <<END
(test)(te st) tesst. test test test test [teest] [teseeet]
(teeeest)(te st) tst. tet test [teseet]
(tst) tst. tet test [tseeet]
END
test tesst  test test test test [teest] tese
teeeest tst  tet test tese
tst tst  tet test tsee

원하는 출력:

 test         tesst  test test test test [teest] tese
 teeeest         tst  tet test tese
 tst  tst  tet test  tsee

관련 정보