문자 q를 포함하고 바로 뒤에 au가 오지 않는 모든 단어/문자열을 검색하는 grep 명령을 찾고 있습니다.
grep 'q!u' file
답변1
Linux의 GNU grep
구현은 grep
PCRE 스타일의 "부정 예측 어설션"을 사용할 수 있습니다. PCRE는 "Perl Compatible Regular Expressions"의 약어입니다. 이는 표준 POSIX 정규식에 대한 확장이며 수행하려는 구문은 다음과 같습니다.
q(?!u)
GNU 사용 grep
:
grep -P 'q(?!u)' file
q
은 (직접) 뒤에 a 가 나오지 않는 a 를 포함하는 모든 줄을 찾습니다 u
.
PCRE 탐색 어설션에 대한 자세한 내용은 다음에서 확인할 수 있습니다.
POSIX 표준 정규식을 사용할 수 있습니다.
q[^u]
즉, "a q
다음에는 a가 아닌 것이 (직접)옵니다 u
." 그러나 이 모델은u
문자가 아닌 문자 도 일치합니다.반면, 부정 예측이 포함된 표현식은 다음 문자와 일치하지 않습니다 q
. 예를 들어, 이는 위의 표현식이 q
줄 끝의 a와 일치하지 않음을 의미합니다. 이를 위해 다음을 사용할 수 있습니다.
q([^u]|$)
이는 확장된 정규 표현식입니다( grep
with 를 사용하여 구현됨 -E
).
"단어/문자열"의 경우: A단어문자열입니다단어 문자, 일반적으로 문자 일치입니다 [[:alpha:]]
. ㅏ끈예어느끈. q(?!u)
상단의 표현이 일치합니다.임의의 문자열q
. 뒤에 (직접) 없이 가 포함되어 있습니다 u
.
성냥성격a를 포함 q
하지만 시퀀스는 포함하지 않고 다음 qu
을 수행할 수 있습니다.
grep -P -o -w '[[:alpha:]]*q(?!u)[[:alpha:]]*'
q
즉, (만) 뒤에 a 가 포함된 완전한 단어를 모두 추출하거나 u
두 단계로 수행할 수 있습니다.
grep -o -w '[[:alpha:]]*q[[:alpha:]]*' | grep -v qu
이것은 PCRE가 필요하지 않으며 (따라서 필요하지 않음 -P
) a를 포함하는 모든 단어를 얻은 q
다음제거하다(두 번째 grep
) 단어가 포함되어 있습니다 qu
.
예:
$ grep -o -w '[[:alpha:]]*q[[:alpha:]]*' /usr/share/dict/words | grep -v qu
Iraq
Iraqi
Iraqian
Louiqa
miqra
nastaliq
Pontacq
q
qasida
qere
qeri
qintar
qoph
Saqib
shoq
Tareq
뒤에 not 가 zaqqum
포함되어 있기 때문에 PCRE 변형도 반환됩니다 .q
u
어느 쪽이든 데이터의 모양과 실제로 일치시키려는 내용에 따라 다릅니다.
답변2
나는 다음 awk 명령을 사용하여 이 작업을 수행했습니다.
샘플 파일
prqrtwtw
ahayqlo
prasqu
예상 출력
prqrtwtw
ahayqlo
주문하다:
k=`awk -F "" '{print NF}' examplefile | sort -nr | sed -n '1p'`
for ((i=1;i<=$k;i++))
> do
> awk -v i="$i" -F "" '$i=="q" && $(i+1) !="u" {print $0}' examplefile;done
output
prqrtwtw
ahayqlo