grep 명령이 검색 문자열의 마침표를 무시하는 이유는 무엇입니까?

grep 명령이 검색 문자열의 마침표를 무시하는 이유는 무엇입니까?

내가 사용하는 명령은 다음과 같습니다.

find . -type f -name "*.sql" -exec grep -i -l 'schema_name.' {} +

내가 검색하고 싶은 것은 모두 포함되어 있습니다 schema_name.. 그러나 find 명령은 마지막 것을 무시 하고 대신 그것을 .찾습니다 .schema_nameschema_name.

답변1

그게 grep문제야, 아니야 find.

grep기본적으로 정규식은 schema_name.문자열 뒤의 모든 문자를 나타내는 패턴을 일치시키는 데 사용됩니다 schema_name.

점을 문자 그대로 일치시키려면 .백슬래시를 사용하여 점을 이스케이프 처리해야 합니다 \.

find . -type f -name "*.sql" -exec grep -il 'schema_name\.' {} +

또는 -F다음 옵션을 사용하세요.

find . -type f -name "*.sql" -exec grep -Fil 'schema_name.' {} +

답변2

fgrep을 사용할 수 있습니다.

find . -type f -name "*.sql" -exec fgrep -i -l 'schema_name.' {} +

아마도 이전 Unix OS에서 훨씬 더 빠를 것입니다(fgrep, grep 및 egrep는 3개의 다른 실행 파일이었고 fgrep은 정규식과 관련된 모든 것을 완전히 생략했기 때문에 훨씬 더 빨랐습니다. 예를 들어 GNU 기반 시스템에서 이 세 프로그램은 동일한 실행 파일에 대한 링크일 뿐입니다.) ).

답변3

검색 패턴의 이스케이프 도트 grep:

find . -type f -name "*.sql" -exec grep -i -l 'schema_name\.' {} +

답변4

grep 명령이 검색 문자열의 마침표를 무시하는 이유는 무엇입니까?

그러나 실제로는 그렇지 않습니다.

증명하려면 실행하세요.

grep . file

빈 줄을 모두 제거하는 쉬운 방법은 다음과 같습니다 file.

즉, .단일 문자(개행 제외)에 대한 정규식 원자입니다. 문자 그대로 점을 일치시키려면 원자를 다음과 같이 이스케이프해야 합니다.\.

관련 정보