Linux에서 특정 문자열을 어떻게 추출합니까?

Linux에서 특정 문자열을 어떻게 추출합니까?

저는 Bash의 초보자이고 아래 파일에서 특정 문자열을 얻는 방법에 어려움을 겪었습니다.

  DS*SC*S45WG*X56558*2
  NE*823*2*SC*q345w45*DT*RTD*7530SRT
  RJTROIT**20140617
  SNA**TP*55
  DS*SC*S45WG*X56558*2
  NE*17*2*SC*211*DT*DFS*75304KSRTRSHT**20140617
  RSS**TP*55
  DS*SC*S45WG*X56558*2
  NE*18*1*SC*3435*DT*PR*753SLRT
  JSRT**20140617~RSS**TP*55
  DS*SC*S45WG*X56558*1
  NE*19*1*SC*ERS*DT*DFS*753048SRY
  TSERY4654**20140617~RSS**TP*60
  DS*SC*S45WG*X56558*1
  NE*19*1*SC*FRAE*DT*ESS*753048499RYTSR**20140722
  RSS**TP*140
  DS*SC*S45WG*X56558*1
  NE*73*46464
  SD**15769
  SNA*PUI*000015769

위에서 언급한 이 파일을 사용하여 다음과 같은 모든 데이터/값을 얻고 싶습니다.

7530SRTRJTROIT
75304KSRTRSHT
753SLRTJSRT
753048SRYTSERY4654
753048499RYTSR

(예를 들어 NE*823*2*SC*q345w45*DT*RTD 옆에 있는 항목) 감사해요!

답변1

관심 있는 값이 여러 줄로 분할된 것 같으므로 올바른 패턴을 일치시키기 위해 순수한 Perl 정규식을 사용하겠습니다.

cat file.txt | perl -e 's/\s//g && print "$_\n" for join("", <>) =~ /\*([\w\s]+)[~]{0,1}\w{3}\*\*TP/gm'

참고: 찾고 있는 값이 다음 구분 기호로 끝난다고 가정했습니다.

XXX**TP귀하의 예에서는 어디에 XXX있을 수 있습니까 RSS?SNA

작동 원리

  • join("", <>)cat명령 결과로부터 단일 문자열을 생성합니다.
  • =~이 정규식을 사용하여 (연산자)를 구문 분석하는 데 사용합니다 .

    /\*([\w\s]+)[~]{0,1}\w{3}\*\*TP/gm

    이 정규 표현식은 별표로 시작하고 \*[A-Za-z0-9_] 문자(단축키는 \w단어용)와 공백 \s, 가능한 ~(0 또는 1회) 및 3개의 단어 문자(예: RSS또는 SNA) 로 구성된 문자열을 찾습니다. 별 \*\*다음에 TP.

    괄호는 그 사이에 포함된 패턴만 캡처하는 데 사용됩니다.

    /gmg모든 일치 문자열(첫 번째 문자열뿐만 아니라)을 반환하고 여러 줄 검색을 허용하는 정규식 수정자입니다 m.

  • for문은 모든 결과를 반복하고 발견된 각 일치 항목을 호출합니다 s/\s//g && print "$_\n".

    s/\s//g모든 공백(캐리지 리턴 포함)을 제거하고 print "$_\n"최종 결과( $_for 루프의 현재 값)를 출력합니다.

예상 값을 제공합니다(명령에 하드코딩하지 않음).

7530SRTRJTROIT
75304KSRTRSHT
753SLRTJSRT
753048SRYTSERY4654
753048499RYTSR

업데이트: (날짜 패턴을 포함하기 위해)

지금 다음 명령을 사용하십시오:

cat file.txt | perl -e 'for$a(join("", <>)=~/\*([A-Z0-9\s]+?)\*\*\d{8}/g){$a=~s/\s+//g;print"$a\n"}'

답변2

cat파일을 표시하고 grep원하는 값이 포함된 행만 가져오는 데 사용할 수 있습니다 .

예:cat myfile | grep 7530SRTRJTROIT

egrep또는 정규식을 허용하는 여러 값을 얻으려면 다음을 사용할 수 있습니다 .
egrep "7530SRTRJTROIT|75304KSRTRSHT|753SLRTJSRT|753048SRYTSERY4654|753048499RYTSR" myfile

관련 정보