저는 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
.괄호는 그 사이에 포함된 패턴만 캡처하는 데 사용됩니다.
/gm
g
모든 일치 문자열(첫 번째 문자열뿐만 아니라)을 반환하고 여러 줄 검색을 허용하는 정규식 수정자입니다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