grep을 사용할 때 리터럴 백슬래시가 있는 문자열을 검색하는 방법은 무엇입니까?

grep을 사용할 때 리터럴 백슬래시가 있는 문자열을 검색하는 방법은 무엇입니까?

\G백슬래시가 포함된 문자열을 검색하고 싶습니다 grep.

$ echo "\G\\G" > /tmp/test
$ grep '\G' /tmp/test 
\G\G
$ grep '\\G' /tmp/test 
\G\G
$ grep "\\G" /tmp/test 
\G\G
$ grep "\G" /tmp/test 
\G\G

빨간색으로 일치하는 항목은 아래 스크린샷도 참조하세요.

여기에 이미지 설명을 입력하세요.

왜 작동하는지 알고 싶습니다 '\\G'. 그냥 bash인가요, 아니면 bash와 grep인가요? 감사해요.

답변1

grep이는 쉘이 보는 것과 쉘이 보는 것과 관련이 있습니다. 그래서 둘 다 조금.

grep다양한 형태의 인용에 대해 표시되는 내용을 보려면 다음을 사용하세요.

printf '<%s>\n' G "G" 'G' \G "\G" '\G' \\G "\\G" '\\G'

이게 뭘 보여줄까껍데기다양한 유형의 참조와 관련됩니다.


grep만 보이는 경우 G일치하는 항목만 검색하고 설정에 따라 강조 표시합니다 G.

grep백슬래시 뒤에 a가 표시 되면 G(귀하의 구현 및 아마도 모든 현재 구현에서) 백슬래시가 문자의 특별한 의미를 제거한다고 생각할 것입니다 G. 하지만 특별한 의미는 없으므로 G결과는 방금 통과한 것과 같습니다 G.

두 개의 백슬래시가 있는 경우 grep첫 번째 백슬래시는 두 번째 백슬래시의 특별한 의미를 제거합니다. 따라서 grepsee 를 사용하면 \\G문자 그대로 백슬래시를 검색한 다음 G.

고정 문자열을 검색하기 위해 -F플래그를 사용하는 경우 just를 전달하여 동일한 결과를 얻을 수 있습니다. (즉, 이렇게 전달하면grep\G\Ggrep 보다 \G, 어떤 방식으로든 백슬래시를 이스케이프 처리해야 합니다.껍데기삭제되지 않습니다. )

답변2

당신이 언급한 예에서\G\\G

\\G==>는 \G로만 처리됩니다. 백슬래시는 Linux에서 특별한 의미를 갖기보다는 일반 문자열로 처리합니다. 따라서 첫 번째 백슬래시로 인해 다음 문자열이 일반 문자열로 처리됩니다. 따라서 첫 번째 백슬래시는 고려되지 않습니다.

일반 문자열로 사용하려면 " \\G로 언급해야 합니다 .echo "\G\\\G

다음 예제로 테스트했습니다.

다음을 언급하여 파일을 만들었습니다.

고양이 테스트.txt

\G
\\G

grep만 하고 싶다면 \G다음 명령을 사용합니다.

grep '^\\G' test.txt

산출

\G

grep만 하고 싶다면 "\\G"다음 명령을 사용합니다.

grep '\\\\G' test.txt

산출

\\G

이것을 sed 명령으로 바꿀 수 있습니다

\G가 포함된 행을 찾으려면 다음 명령을 사용하십시오.

sed -n '/^\\G/p' test.txt

\\G다음 명령이 포함된 행을 찾으려면

sed -n '/\\\\G/p' test.txt

관련 정보