다소 특별한 형식의 문자열에서 여러 데이터 필드를 추출하려고 합니다.
각 문자열의 형식은 다음과 유사합니다(강조를 위해 공백이 추가됨).
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..6
1..2
3
5..6
3
지금까지 다음 코드를 성공적으로 추출 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..2
수 5..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