Unix 파일에서 정규식을 사용하여 하위 문자열 추출

Unix 파일에서 정규식을 사용하여 하위 문자열 추출

다음 내용이 포함된 파일이 있습니다.

/ABC/RTE/AD_900_VOP_123/OPP
/ABC/RTE/TRE/AD_900_VOP_145/BBB
/ABC/RTE/AN_900_VFP_124/FBF
/ABC/RTE/HD_900_FOP_153/WEW
/ABD/RDV/AD_900_VOP_123/OPP
/ABC/RTE/WD_900_VOP_123/GRR/TRD
/ABC/RTE/RTD/AR_900_VOP_443/SDD

이 파일에 정규식을 사용하여 아래와 같은 출력을 얻으려면 어떻게 해야 합니까?

AD_900_VOP_123
AD_900_VOP_145
AN_900_VFP_124
HD_900_FOP_153
AD_900_VOP_123
WD_900_VOP_123
AR_900_VOP_443

답변1

Gnu grep

grep -oE '[[:alpha:]]+_[[:digit:]]+_[[:alpha:]]+_[[:digit:]]+' 

Perl-regex 플래그와 Lookbehind 및 Lookahead 어설션을 사용하여 일치 항목이 대괄호로 묶였는지 확인하세요./

grep -oP '(?<=/)[[:alpha:]]+_[[:digit:]]+_[[:alpha:]]+_[[:digit:]]+(?=/)'

답변2

IMHO, Perl은 가장 간단하고 유연한 솔루션을 제공합니다.

perl -nE 'say $1 if m{/(\w+\d+\w+\d+)/};' input_file

이는 input_file선택 사항입니다. STDIN입력 파일 이름이 제공되지 않으면 필터링됩니다.

답변3

한 가지 방법은 다음과 같습니다 awk.

awk -F/ '{for(i=1;i<=NF;i++)$0=($i~/_/)?$i:$0}1' file

답변4

sed 's|.*/\([^/]*_[^/]*\)/.*|\1|
' <<\INPUT
/ABC/RTE/AD_900_VOP_123/OPP 
/ABC/RTE/TRE/AD_900_VOP_145/BBB 
/ABC/RTE/AN_900_VFP_124/FBF 
/ABC/RTE/HD_900_FOP_153/WEW 
/ABD/RDV/AD_900_VOP_123/OPP 
/ABC/RTE/WD_900_VOP_123/GRR/TRD 
/ABC/RTE/RTD/AR_900_VOP_443/SDD
INPUT

/이렇게 하면 줄에서 바로 앞의 두 번째 문자가 삭제되고 해당 문자와 ​​다음 문자 사이의 모든 문자가 저장되고 나머지 문자가 삭제됩니다._/

위의 명령이 인쇄됩니다....

AD_900_VOP_123 
AD_900_VOP_145 
AN_900_VFP_124 
HD_900_FOP_153 
AD_900_VOP_123 
WD_900_VOP_123 
AR_900_VOP_443

관련 정보