aq를 포함하고 뒤에 au가 오지 않는 단어/문자열 찾기

aq를 포함하고 뒤에 au가 오지 않는 단어/문자열 찾기

문자 q를 포함하고 바로 뒤에 au가 오지 않는 모든 단어/문자열을 검색하는 grep 명령을 찾고 있습니다.

grep 'q!u' file

답변1

Linux의 GNU grep구현은 grepPCRE 스타일의 "부정 예측 어설션"을 사용할 수 있습니다. 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]|$)

이는 확장된 정규 표현식입니다( grepwith 를 사용하여 구현됨 -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 변형도 반환됩니다 .qu

어느 쪽이든 데이터의 모양과 실제로 일치시키려는 내용에 따라 다릅니다.

답변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

관련 정보