별 2개(**)로 시작하는 고유한 줄이 포함된 파일이 있습니다.
그러나 grep 명령을 실행하면
grep \*\* fileName
파일의 모든 줄을 얻습니다. 이것은 매우 드문 일입니다. 제가 본 일치하지 않는 줄에는 **가 포함되어 있지 않습니다.
올바른 줄을 찾기 위해 **를 어떻게 탈출합니까?
답변1
grep
일치시킬 문자열이 고정 문자열임을 표시하여 동일한 목적을 달성할 수도 있습니다 . 이를 수행하는 스위치는 -F
또는 입니다 --fixed-strings
.
-F, --fixed-strings
Interpret PATTERN as a list of fixed strings, separated by
newlines, any of which is to be matched. (-F is specified by
POSIX.)
따라서 다음과 같이 하면 됩니다.
$ grep -F "**" somefile.txt
예
$ cat somefile.txt
** blah
blahblah
** hi
파일을 Grep하고 다음 결과를 생성합니다.
$ grep -F "**" somefile.txt
** blah
** hi
답변2
그러니 시도해 보세요:
egrep "^\*\*" YOUR_FILE
큰따옴표를 사용하는 것을 잊지 마세요.
노트:egrep
대신 사용하려면 을 사용하세요 grep
.
grep
grep -E
답변3
존재하다:
grep \*\* fileName
*
백슬래시는 셸( *
와일드카드 문자) 에서 이스케이프하는 데 사용됩니다 .
grep
두 번째 매개변수로 받은 문자열은 두 문자로 구성된 문자열입니다: **
.
정규식으로서 이는 다음을 의미합니다.임의(0개 이상)의 별표 문자, 빈 문자열과도 일치하므로 기본적으로 어디에서나 일치합니다. 이는 파일의 모든 줄을 얻는 이유를 설명합니다.
정규 표현식 *
은 특별하기 때문에grep
게다가, 거기에서도 탈출해야합니다. *
셸로 이스케이프하려면 백슬래시 대신 작은따옴표를 사용하는 것이 좋습니다 (작은따옴표는 강력한 셸 따옴표이고 작은 따옴표 문자 자체를 제외한 모든 문자를 이스케이프할 수 있기 때문입니다). 그리고 백슬래시를 사용하여 *
grep으로 이스케이프하는 것이 좋습니다. 이 경우 큰따옴표도 작동하지만 백슬래시는 여전히 큰따옴표 안의 셸에 특별하다는 점에 유의하세요.
그래서:
grep '\*\*' somefile.txt
( *
이스케이프하면 더 이상 정규식 연산자가 아니며 리터럴 문자로 처리됩니다.) somefile.txt
2개의 별표 문자 시퀀스를 포함하는 줄이 반환됩니다. 줄의 시작 부분에서만 찾으려면 고정된 정규식 연산자를 사용해야 합니다 ^
.
grep '^\*\*' somefile.txt
정규식 연산자로 간주되지 않는 또 다른 방법은 *
문자 범위를 사용하는 것입니다.
grep '^[*][*]' somefile.txt
지정하는 또 다른 방법둘별표 문자는 다음과 같이 작성됩니다.
grep '^\*\{2\}' somefile.txt
(다른 정규식 연산자는 어디에 있습니까?) \{
옵션을 전달할 때 확장 정규식을 사용하면 읽기가 더 쉽습니다(표준이 아니므로 피하십시오).-E
grep
egrep
grep -E '^\*{2}' somefile.txt
(확장 정규식에서는 {
정규식 연산자)