파일에서 특정 문자열을 추출하는 방법은 무엇입니까?

파일에서 특정 문자열을 추출하는 방법은 무엇입니까?

데이터를 구문 분석하는 데 문제가 있습니다. 아래 표시된 파일에서 다음 문자를 얻고 싶습니다 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
    

    설명하다

    -ogrep은 일치하는 줄 부분만 인쇄하고 -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어떠한 출력물도 인쇄할 수 없습니다 . 마지막에 있는 두 번째 대체 연산자는 psed가 대체에 성공한 모든 거짓말을 인쇄하도록 합니다.

  • awk -F'[*…]' '/BIG\*20021208\*00001\**/{print $(NF-1)}' file
    

    설명하다

    -Fawk의 입력 필드 구분 기호를 *또는 로 설정합니다 . 이는 마지막에서 두 번째 필드가 원하는 필드가 됨을 의미합니다. 위의 명령은 일치하는 줄에 인쇄합니다 BIG*20021208*00001*.

  • 진주

    perl -lne '/BIG\*20021208\*00001\**(.*)…/ && print "$1"' file
    

    설명하다

    -nPerl이 입력을 한 줄씩 읽고 주어진 스크립트를 적용하도록 합니다 -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

관련 정보