grep 및 달러 기호 탈출


31

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

grep \$Id\$  my_dir/mylist_of_files

0 번 발생을 반환합니다.

나는 내가 사용해야한다는 것을 발견했다.

grep \$Id$ my_dir/mylist_of_files

그런 다음 $Id출력에 색상이 표시되어 일치합니다.

두 번째를 어떻게 일치시킬 수 $있고 왜 작동하지 \$Id\$않습니까?

두 번째 $문자가 마지막 문자인지 여부는 중요하지 않습니다.

나는 grep2.9를 사용 합니다.


내 질문을 게시하기 전에 Google을 사용했습니다 ...

답을 찾았습니다

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

grep \\ $ test2

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

그러나 왜 grep \$Id효과가 있고 왜 효과 가 없는지 이해 grep \\$Id\\$하지 못합니다.

조금 혼란 스러워요 ...

답변:


25

여기에는 두 가지 별도의 문제가 있습니다.

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

  2. 여기서는 완전히 관련이없는 이스케이프 / 인용 메커니즘이 있습니다 : 쉘 인용 및 정규식 백 슬래시 인용. 문제는 정규 표현식에 사용되는 많은 문자가 쉘에도 특수한 것이며, 정규 표현식 이스케이프 문자 인 백 슬래시도 쉘 인용 문자이기도합니다. 그렇기 때문에 이중 백 슬래시와 관련된 혼란이 종종 발생하지만 정규 표현식을 인용하는 쉘에는 백 슬래시를 사용하지 않는 것이 좋습니다.

    대신 가장 간단한 방법은 먼저 전체 정규 표현식을 작은 따옴표 안에 넣는 것입니다 'regex'. 작은 따옴표는 쉘이 인용하는 가장 강력한 형태의 따옴표이므로 정규 표현식에 작은 따옴표가 포함되어 있지 않으면 더 이상 쉘 인용에 대해 걱정할 필요가 없으며 순수한 BRE 구문에 집중할 수 있습니다.

따라서 이것을 원래 예제에 다시 적용하여 \$Id\$작은 따옴표 안에 올바른 정규 표현식 ( )을 던져 봅시다 . 다음은 원하는 것을 수행해야합니다.

grep '\$Id\$' my_dir/my_file

\$Id\$작동하지 않는 이유 는 쉘 따옴표 제거 (쉘 인용을 말하는 더 정확한 방법)가 적용된 후에 보이는 정규 표현식이 있기 때문 grep입니다 $Id$. (1.)에서 설명 했듯이이 정규 표현식 $Id은 첫 번째 $문자는 리터럴이고 두 번째는 특수 앵커 문자 이기 때문에 줄 끝에서만 리터럴과 일치합니다 .

¹ 또한 확장 정규 표현식 (ERE)으로 전환 한 경우 (예 : egrep(또는 grep -E) 를 사용하기로 결정한 경우 , $캐릭터는 항상 특별합니다. ERE에서는 줄 끝 이후$Id$문자를 사용할 수 없으므로 유일한 방법이 아닙니다.\$Id\$


3
grep이 첫 번째 매개 변수를 정규식으로 해석하지 않도록하기 위해 수행 할 수도 있습니다 grep -F '$Id$'.
jfg956

내 껍질 (bash 4.3.42) grep '$Id\$' ...에서 grep \$Id\\$ ...일하고
nitsas

2
그리고 이것이 makefile의 명령 인 경우 $앞에 $:를 사용하여 이스케이프해야합니다 grep '$$Id\$$'. stackoverflow.com/a/2382810/2097284
Camille Goudeseune

-2

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


2
그 시작으로 아무것도 일치 $id그래서, $idea그냥, 예를 들어뿐만 아니라 $id$.
terdon
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.