이런 텍스트가 있는데 여는 괄호 옆에 있는 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
하고 인쇄하기 전에 마지막 문자를 지웁니다.