Grep 'OR'정규식 문제


65

grep을 정규식과 함께 사용하여 가능한 문자열 중 하나와 일치하는 파일에서 줄을 찾으려고합니다. 여기 내 grep이 있습니다 :

$ grep "^ID.*(ETS|FBS)" my_file.txt

위의 grep은 결과를 반환하지 않습니다. 그러나 내가 하나를 실행하면 :

$ grep "^ID.*ETS" my_file.txt  

또는

$ grep "^ID.*FBS" my_file.txt  

특정 줄과 일치합니다. 내 OR 정규식이 왜 일치하지 않습니까? 도움을 주셔서 감사합니다.

답변:


94

일반 정규 표현식, 문자로 (, |그리고 )필요 이스케이프합니다. 그래서 당신은 사용해야합니다

$ grep "^ID.*\(ETS\|FBS\)" my_file.txt

확장 정규식 ( -E) 옵션 을 사용할 때 이스케이프가 필요하지 않습니다 . man grep섹션 " Basic vs Extended Regular Expressions"을 참조하십시오 .


10
egrep대신에 사용할 수도 있습니다 grep -E.
Riccardo Murri

2
@RiccardoMurri Michal의 대답에 따르면 egrep (및 fgrep)은 더 이상 사용되지 않습니다 (아직 작동 할 수도 있음).
Timo

27

여러 분기 ( |as or) 를 사용하려는 경우 호환성을 높이려면 "modern RE"(일명 RE)를 사용한다고 명시 적으로 언급하는 것이 좋습니다. 오히려.

그렇게하려면 grep -E를 사용하십시오 .

grep -E "^ID.*(ETS|FBS)" my_file.txt

RE, ERE 및 전체 "현대"ER 스토리에 대한 자세한 내용은을 참조하십시오 man 7 regex.

또는 egrep대신 대신 사용할 수 grep있지만 다음과 같이 읽을 수 있습니다 man grep.

egrep은 grep -E와 동일합니다. fgrep는 grep -F와 같습니다.

(...)

egrep 또는 fgrep 로서의 직접 호출 은 더 이상 사용되지 않습니다


egrep의 직접 호출은 더 이상 사용되지 않지만 대부분의 * nix 변형에서 작동합니다.
Mark D
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.