어떤 파일에 $Id$ 문자열이 있는지 알고 싶습니다.

grep \$Id\$ my_dir/mylist_of_files 

0 번을 반환합니다.

사용해야 함을 발견했습니다.

grep \$Id$ my_dir/mylist_of_files

그런 다음 $Id가 출력에서 색상이 지정되어있는 것을 볼 수 있습니다. 즉, 일치되었습니다.

어떻게 일치시킬 수 있습니까? 두 번째 $\$Id\$가 작동하지 않는 이유는 무엇입니까?

두 번째

는 마지막 문자입니다.

grep 2.9를 사용합니다.


이전 내 질문을 게시하고 Google을 사용했습니다 …

답변을 찾았습니다.

test2라는 파일에서 $ (달러 기호)를 검색하려면 다음을 입력하십시오.

grep \\ $ test2

\\ (이중 백 슬래시) 문자 쉘이 \ $ (단일 백 슬래시, 달러 기호)를 전달하도록 강제하기 위해 필요합니다. grep 명령에. \ (단일 백 슬래시) 문자는 grep 명령이 다음 문자 (이 예에서 $)를 표현식 문자가 아닌 리터럴 문자로 처리하도록 지시합니다. 백 슬래시와 같은 이스케이프 문자를 사용하지 않으려면 fgrep 명령을 사용하세요.

하지만 작동하고 왜 grep \\$Id\\$ 작동하지 않습니다.

조금 혼란 스럽습니다 …

답변

여기에 2 개의 개별 문제가 있습니다.

  1. grep 기본 정규식 (BRE)을 사용하고 $는 BRE의 특수 문자입니다. “는 표현식의 끝에 만 있습니다. 그 결과 $Id$에있는 $의 두 인스턴스가 동일하지 않습니다. 첫 번째는 일반 문자이고 두 번째는 줄 끝과 일치하는 앵커입니다. 두 번째 $를 리터럴 $ 백 슬래시로 이스케이프 처리해야합니다 (예 : $Id\$). 첫 번째 $를 이스케이프해도 작동합니다. \$Id\$, 더 일관성있게 보이기 때문에 선호합니다 .¹

  2. 여기서는 완전히 관련되지 않은 두 가지 이스케이프 / 인용 메커니즘이 작동합니다. 쉘 인용과 정규식 백 슬래시 인용입니다. 문제는 정규식이 사용하는 많은 문자가 셸에도 특별하며 그 위에 정규식 이스케이프 문자 인 백 슬래시도 셸 인용 문자라는 것입니다. 그렇기 때문에 이중 백 슬래시가 포함 된 엉망이되는 경우가 많지만 셸 인용 정규 표현식에는 백 슬래시를 사용하지 않는 것이 좋습니다. 읽기가 쉽지 않기 때문입니다.

    대신에 가장 간단한 방법은 먼저 다음을 입력하는 것입니다. "regex"에서와 같이 작은 따옴표 안에 전체 정규식. 작은 따옴표는 셸이 가진 가장 강력한 따옴표 형식이므로 정규식에 작은 따옴표가 포함되지 않는 한 더 이상 셸 따옴표에 대해 걱정할 필요가 없으며 순수한 BRE 구문에 집중할 수 있습니다.

그러므로 이것을 원래 예제에 다시 적용하여 작은 따옴표 안에 올바른 정규식 (\$Id\$)을 넣으십시오. 다음은 원하는 작업을 수행해야합니다.

grep "\$Id\$" my_dir/my_file 

\$Id\$가 작동하지 않는 이유는 셸 인용 제거 후 (셸 인용)이 적용되면 grep에 표시되는 정규식은 $Id$입니다. (1.)에서 설명한대로이 정규식은 리터럴 $Id 첫 번째 $는 리터럴이고 두 번째는 특수 앵커 문자이기 때문에 줄 끝에서만 가능합니다.

¹ 또한 확장 정규식 (ERE)으로 전환 한 경우 (예 : (또는 grep -E), $ 문자는 항상 특별합니다. ERE에서 $Id$는 줄 끝 뒤에 문자를 가질 수 없기 때문에 아무것도 일치하지 않습니다. 따라서 \$Id\$가 유일한 방법입니다.

댓글

  • grep이 첫 번째 매개 변수를 정규 표현식으로 해석하지 않도록하려면 , grep -F '$Id$'를 수행 할 수도 있습니다.
  • 내 셸 (bash 4.3.42) grep '$Id\$' ...grep \$Id\\$ ... 작동
  • 메이크 파일의 명령 인 경우 $도 선행

    : grep '$$Id\$$'. 스택 오버플로.com / a / 2382810 / 2097284

답변

검색하려면 $Id$ 파일 : 다음을 사용할 수 있습니다. grep "\$id*" filename

댓글

  • $id로 시작하는 모든 항목과 일치하므로 $id$뿐만 아니라 $idea도 마찬가지입니다. .

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다