지정된 두 단어(대소문자 구분 안 함)가 포함된 모든 줄을 찾는 방법은 무엇입니까? [복사]

지정된 두 단어(대소문자 구분 안 함)가 포함된 모든 줄을 찾는 방법은 무엇입니까? [복사]

텍스트 파일의 한 줄에 두 개의 (지정된) 단어가 있는지 확인해야 합니다. 단어의 문자에는 제한이 없습니다. 예를 들어:

텍스트 파일에서 "cat"과 "elephant"라는 단어가 모두 포함된 줄을 찾고 싶습니다(즉, 같은 줄에 있어야 하며 반드시 나란히 있을 필요는 없음).

Cat is smaller than elephant
Elephant is larger than cat
Cats are cute!
Elephants are very strong
Cat and elephants live in different environments
cats are friendly

이전 예에서 이 두 단어가 포함된 줄을 어떻게 찾나요?

Cat is smaller than elephant
Elephant is larger than cat
Cat and elephants live in different environments

grep과 awk를 시도했지만 희망이 없습니다. 문제는 일부 단어에는 대문자와 소문자가 있는데 문자 상태에 관계없이 이 두 단어를 어떻게 일치시킬 수 있다는 것입니다! ?

답변1

그리고grep

grep -i "cat" file | grep -i "elephant"

Cat is smaller than elephant
Elephant is larger than cat
Cat and elephants live in different environment

의 플래그는 grep대소문자(대문자/소문자)를 무시하는 것입니다.

 -i, --ignore-case         ignore case distinctions

또는awk

awk 'BEGIN{IGNORECASE=1} /cat/&&/elephant/{print $0}' file

@glennjackmanawk명령문을 다음과 같이 실행하는 것이 좋습니다 .

awk '/cat/&&/elephant/' IGNORECASE=1 file

답변2

$ grep -Fiw cat <file | grep -Fiw elephant
Cat is smaller than elephant
Elephant is larger than cat

먼저 파일에서 file단어가 포함된 모든 줄을 추출한 cat다음 이 줄을 단어가 포함된 줄로 좁힙니다 elephant.

이는 grep -F -i -wwhere를 사용하여 수행됩니다.

  • -Fgrep패턴이 정규식 대신 고정 문자열로 처리되도록 합니다 .
  • -igrep대소문자를 구분하지 않고 일치를 수행하고
  • -wgrep완전한 단어 만 일치시킵니다 .

-w옵션은 다음 옵션의 확장입니다.POSIX 표준grep, 그러나 가장 일반적인 grep구현으로 구현됩니다. 일치하는 문자열이 더 긴 단어의 일부인 경우 기본적으로 주어진 패턴 일치를 허용하지 않습니다.

라인이 맞지 않았으니 참고하세요

Cat and elephants live in different environment

s결승전 때문이다 elephants. 나도 그 선에 맞지 않을 거야

elephantiasis is catastrophic

같은 이유로.

s단어 끝에 복수형을 사용하시겠습니까?

$ grep -Eiw 'cats?' <file | grep -Eiw 'elephants?'
Cat is smaller than elephant
Elephant is larger than cat
Cat and elephants live in different environment

여기서는 두 호출 모두에서 고정 문자열 대신 (확장) 정규식을 사용합니다 grep. 표현식은 s두 단어 끝에 있는 선택적 값과 일치합니다. 이제 catand cats(대소문자 구분 안 함)는 일치 하지만 catnip, catsup, 또는 는 일치하지 않습니다 scat.

답변3

GNU sed 사용:

sed -n '/cat/I {/elephant/I p}' file

또는 펄

perl -ne 'print if /cat/i and /elephant/i' file

또는 단일 grep

grep -i -e 'cat.*elephant' -e 'elephant.*cat' file

답변4

GNU가 아닌 곳에서 awk 대소문자를 구분하지 않으려면 "가난한 사람의" 트릭을 사용할 수 있습니다.

awk '/[Cc][Aa][Tt]/ && /[Ee][Ll][Ee][Pp][Hh][Aa][Nn][Tt]/'  문서
여기서 , , 또는 중 하나와 일치하는 것처럼 [aeiou]or도 일치합니다. 즉, "e"의 대소문자를 구분하지 않는 일치입니다.aeiou[Ee]Ee

이 접근 방식(예:모두지금까지 여기에 게시된 다른 답변은) 라인과 일치합니다

할 수 있는 방법은 여러 가지가 있습니다고양이코끼리를 확인해 보세요.
"라는 단어 때문에고양이ch"에는 "cat"이라는 문자열이 포함되어 있습니다. 이를 방지하려면 다음을 시도하십시오.
awk '/(^|\W)[Cc][Aa][Tt](\W|$)/ && /(^|\W)[Ee][Ll][Ee][Pp][Hh][Aa ][Nn][Tt](\W|$)/'  문서
각 단어 앞에는 단어가 아닌 문자(또는 줄의 시작)가 있고 그 뒤에는 단어가 아닌 문자(또는 줄의 끝)가 오도록 제한합니다. 이는 단어가 아닌 문자 \W(예: 공백)(또는 탭) 또는 기타 문자와 일치합니다. 영숫자가 아닌 *특징).

(이것이 POSIX와 호환되는지 확실하지 않습니다.)

이제 이 작업이 수행됩니다.아니요성냥

고양이와 코끼리는 서로 다른 환경에서 살아요
왜냐하면 "코끼리"라는 단어는 "코끼리"라는 단어와 다르기 때문입니다.
____________________
* 이 경우 밑줄("_" 문자)은 한 글자로 간주됩니다.

관련 정보