
어떤 파일에 문자열이 있는지 알고 싶습니다 $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
여기에는 두 가지 별도의 문제가 있습니다.
grep
사용기본 정규식(BRE)는$
BRE에서 표현식 끝에만 나타나는 특수 문자입니다. 결과적으로$
in 의 두 인스턴스가$Id$
동일하지 않습니다. 첫 번째는 일반 문자이고 두 번째는 줄 끝과 일치하는 앵커입니다. 두 번째$
일치 항목을 리터럴로 만들려면$
백슬래시를 사용하여 이스케이프해야 합니다. 즉,$Id\$
첫 번째 일치 항목을 이스케이프하는$
것도 가능합니다.\$Id\$
저는 이것이 더 일관되게 보이기 때문에 선호합니다.여기에는 전혀 관련이 없는 두 가지 이스케이프/인용 메커니즘이 있습니다. 즉, 쉘 인용과 정규식 백슬래시 인용입니다. 문제는 정규식에 사용되는 많은 문자가 셸에도 특수하고, 정규식 이스케이프 문자(백슬래시)도 셸 인용 문자라는 점입니다. 이것이 이중 백슬래시와 관련된 혼동을 자주 보는 이유입니다. 그러나 쉘에서 정규식을 인용할 때 백슬래시는 읽기가 쉽지 않기 때문에 사용하지 않는 것이 좋습니다.
대신, 가장 쉬운 방법은 먼저 전체 정규식을 작은따옴표 안에 넣는 것입니다
'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