grep 및 달러 기호 탈출

grep 및 달러 기호 탈출

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

grep \$Id\$  my_dir/mylist_of_files

0번 발생을 반환합니다.

사용해야 한다는 것을 알았습니다

grep \$Id$ my_dir/mylist_of_files

$Id그런 다음 출력에서 ​​색상이 지정되었음을 확인합니다 . 즉, 일치했습니다.

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

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

2.9를 사용하고 있습니다 grep.


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

나는 답을 찾았다

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

grep \\$ test2

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

grep \$Id하지만 왜 작동하는지, 왜 grep \\$Id\\$작동하지 않는지 이해하지 못합니다 .

조금 혼란스러워요 ...

답변1

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

  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\$유일한 방법이 될 것입니다.

답변2

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

관련 정보