정규 표현식과 Grep을 사용하여 * 탈출

정규 표현식과 Grep을 사용하여 * 탈출

별 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.
grepgrep -E

답변3

존재하다:

grep \*\* fileName

*백슬래시는 셸( *와일드카드 문자) 에서 이스케이프하는 데 사용됩니다 .

grep두 번째 매개변수로 받은 문자열은 두 문자로 구성된 문자열입니다: **.

정규식으로서 이는 다음을 의미합니다.임의(0개 이상)의 별표 문자, 빈 문자열과도 일치하므로 기본적으로 어디에서나 일치합니다. 이는 파일의 모든 줄을 얻는 이유를 설명합니다.

정규 표현식 *은 특별하기 때문에grep게다가, 거기에서도 탈출해야합니다. *셸로 이스케이프하려면 백슬래시 대신 작은따옴표를 사용하는 것이 좋습니다 (작은따옴표는 강력한 셸 따옴표이고 작은 따옴표 문자 자체를 제외한 모든 문자를 이스케이프할 수 있기 때문입니다). 그리고 백슬래시를 사용하여 *grep으로 이스케이프하는 것이 좋습니다. 이 경우 큰따옴표도 작동하지만 백슬래시는 여전히 큰따옴표 안의 셸에 특별하다는 점에 유의하세요.

그래서:

grep '\*\*' somefile.txt

( *이스케이프하면 더 이상 정규식 연산자가 아니며 리터럴 문자로 처리됩니다.) somefile.txt2개의 별표 문자 시퀀스를 포함하는 줄이 반환됩니다. 줄의 시작 부분에서만 찾으려면 고정된 정규식 연산자를 사용해야 합니다 ^.

grep '^\*\*' somefile.txt

정규식 연산자로 간주되지 않는 또 다른 방법은 *문자 범위를 사용하는 것입니다.

grep '^[*][*]' somefile.txt

지정하는 또 다른 방법별표 문자는 다음과 같이 작성됩니다.

grep '^\*\{2\}' somefile.txt

(다른 정규식 연산자는 어디에 있습니까?) \{옵션을 전달할 때 확장 정규식을 사용하면 읽기가 더 쉽습니다(표준이 아니므로 피하십시오).-Egrepegrep

grep -E '^\*{2}' somefile.txt

(확장 정규식에서는 {정규식 연산자)

관련 정보