데이터를 구문 분석하는 데 문제가 있습니다. 아래 표시된 파일에서 다음 문자를 얻고 싶습니다 BIG**20021208*00001**
. 나는 그것을 시도했지만 sed '/BIG.20021208.00001\**/!d;s///;s/\*.*//'
성공하지 못했습니다. 문제는 line 구분 기호() 와 관련이 있다고 생각합니다 …
.
BIG*20021208*00001**A1001…
TO*7284*0001…BIG*20021208*00001**A999…
NN*ST*XYZ Test Corporation*9*122334455…
NU*987 ELS.…
N4**NY*98765…
ITD*01*3*2**30**45*****60…
N3*123 Highway Street…
N4**12345…
ITD*001*3*2**30**30*****60…
BIG*20021208*00001**8263-83313…
ITD*001*3*2**30**30*****60…
BIG*20021208*00001**8263-83313…
내 예상 결과는 다음과 같습니다
A1001
8263-83313
8263-83313
답변1
이를 수행하는 방법에는 여러 가지가 있습니다. 예를 들어:
grep
grep -oP 'BIG\*20021208\*00001\**\K[A-Z0-9-]+' file
설명하다
-o
grep은 일치하는 줄 부분만 인쇄하고-P
활성화합니다 .Perl 호환 정규식(PCRE) 구문. PCRE 에서는\K
해당 지점까지 일치하는 모든 항목이 삭제됩니다(따라서 인쇄되지 않음-o
).[A-Z0-9-]
는캐릭터 클래스A부터 Z까지의 대문자, 숫자 또는-
및를 한 번 이상 반복할 수 있습니다(+
).대상 문자열에 소문자도 포함될 수 있는 경우
-i
해당 플래그를 사용하여 grep을 실행하거나 문자 클래스를[a-zA-Z0-9-]
.- - 또는- -
grep -oP 'BIG\*20021208\*00001\**\K.+(?=…)' file
설명하다
이는 위와 동일하며 여기에만 긍정적인 예측( )이 있습니다 . 즉 , a 앞에 오는 경우에만 일치한다는
(?=…)
의미입니다 ..+
…
sed
sed -rn 's/…//g;s/.*BIG\*20021208\*00001\**//p;' file
설명하다
s/from/to/
sed의 대체 연산자 입니다 .from
로 대체됩니다to
. 첫 번째 항목은…
아무것도 대체하지 않고 삭제합니다(g
라인의 모든 일치 항목에 대해 이 작업이 수행되었는지 확인하세요). 두 번째는 (.*
)부터BIG*20021208*00001
(*
정규 표현식에서 특별한 의미를 가지므로 )로 이스케이프 처리해야 하는 줄 의 시작 부분부터 모든 항목을 제거한\*
다음 0개 이상의 별표( )를 제거합니다 .\**
결합하면 원하는 것을 제외한 모든 것이 제거됩니다.-n
어떠한 출력물도 인쇄할 수 없습니다 . 마지막에 있는 두 번째 대체 연산자는p
sed가 대체에 성공한 모든 거짓말을 인쇄하도록 합니다.앗
awk -F'[*…]' '/BIG\*20021208\*00001\**/{print $(NF-1)}' file
설명하다
-F
awk의 입력 필드 구분 기호를*
또는 로 설정합니다…
. 이는 마지막에서 두 번째 필드가 원하는 필드가 됨을 의미합니다. 위의 명령은 일치하는 줄에 인쇄합니다BIG*20021208*00001*
.진주
perl -lne '/BIG\*20021208\*00001\**(.*)…/ && print "$1"' file
설명하다
-n
Perl이 입력을 한 줄씩 읽고 주어진 스크립트를 적용하도록 합니다-e
. 각 호출에-l
개행 문자를 추가합니다print
. 위 명령은 관심 있는 문자열(위의 sed 예제 설명 참조)과 일치하는지 확인하고 성공하면 인쇄합니다.awk 예제와 동일한 접근 방식을 사용할 수도 있습니다.
perl -F'[*…]' -lane '/BIG\*20021208\*00001\**/ && print "$F[$#F]"' file
답변2
사용 awk
:
awk -F\* '/^BIG/ {gsub(/…/,""); print $NF}' file
A1001
8263-83313
8263-83313