여는 괄호 옆에 있는 3자만 Grep하세요.

여는 괄호 옆에 있는 3자만 Grep하세요.

이런 텍스트가 있는데 여는 괄호 옆에 있는 3자를 찾고 싶습니다. 도와주세요.

condition: s(XXX_ygh_ghj_jui,00.05) | s(DFG_GHH_CN_GJ_YUI_UYT_UIJ,00.05)
condition: s(GYZ_ygh_ghj_jui,00.05) | s(TYU_GHH_CN_GJ_YUI_UYT_UIJ,00.05)
condition: s(UFG_ygh_ghj_jui,00.05) | s(QWE_GHH_CN_GJ_YUI_UYT_UIJ,00.05)
condition: s(JTH_ygh_ghj_jui,00.05) | s(YUT_GHH_CN_GJ_YUI_UYT_UIJ,00.05)

내가 원하는 o/p는

XXX DFG
GYZ TYU
UFG QWE
JTH YUT

답변1

GNU는 grep이를 수행할 수 있지만 grep다음을 사용하면 일치 항목을 여러 줄로 분할합니다.

$ grep -oP '(?<=\()...' file
XXX
DFG
GYZ
TYU
UFG
QWE
JTH
YUT

@kusalandanda가 댓글에서 제안한 것처럼 한 줄에 넣을 수 있지만 paste이는 다음과 같은 경우에만 작동합니다.정확히한 줄에 두 개의 일치 항목이 있습니다. 그 이상도 이하도 아닌:


$ grep -oP '(?<=\()...' file | paste -d ' ' - - 
XXX DFG
GYZ TYU
UFG QWE
JTH YUT

나는 sed같은 것을 사용하거나 perl. 이러한 솔루션은 행당 1, 2개 이상의 일치 항목을 처리할 수 있습니다.

$ sed 's/[^(]*(\(...\)[^(]*/\1 /g' file
XXX DFG 
GYZ TYU 
UFG QWE 
JTH YUT 

또는

$ perl -lne '@m=(/\((...)/g); print "@m"' file
XXX DFG
GYZ TYU
UFG QWE
JTH YUT

답변2

$ sed 's/.*(\(...\).*(\(...\).*/\1 \2/' file
XXX DFG
GYZ TYU
UFG QWE
JTH YUT

sed표현식은 전체 입력 줄과 일치하지만 두 개의 여는 괄호 뒤의 세 문자를 수집합니다. 그러면 해당 줄은 사이에 공백이 있는 두 개의 수집된 문자 집합으로 대체됩니다.

답변3

또한 다음과 같이 awk설정됩니다 .FS[(_]

awk -v FS='[(_]' '{print $2,$6}' file
XXX DFG
GYZ TYU
UFG QWE
JTH YUT

즉, 구분 기호는 정규식일 수 있습니다. 다음은 몇 가지 추가 예입니다. https://stackoverflow.com/questions/12204192/using-multiple-delimiters-in-awk

답변4

A는 sed각 끝에 추가 공간을 대가로 "필드" 수에 관계없이 작동합니다.

sed -E "s/[c_][^(]+./ /g"  file

c또는에서 시작하는 전역 검색_

[c_]

그 뒤에는 그렇지 않은 것이 뒤따른다.(

[^(]+

다음 문자 .(줄의 마지막 문자가 됨 ()를 추가하고 공백으로 바꿉니다.

또는

이것은 awk또한 "필드 수"에 구애받지 않습니다.

awk -F\( '{for (i=2; i<=$NF; i++) $(i-1)=substr($i,1,3); $NF=""}1' file

FS로 설정된 (다음 필드를 두 번째부터 마지막까지 반복하여 필드를 i-1필드의 처음 3자와 동일하게 설정 i하고 인쇄하기 전에 마지막 문자를 지웁니다.

관련 정보