Grep은 C 스타일 인용 문자열에서 `\n`을 사용하여 파일의 각 줄을 인쇄합니다.

Grep은 C 스타일 인용 문자열에서 `\n`을 사용하여 파일의 각 줄을 인쇄합니다.

grep 검색을 사용하여 문제를 해결하려고 하다가 이상한 점을 발견했습니다.

내 file1.txt에 다음 두 줄이 있다고 가정합니다.

hello
to you

내가 매번

grep $'a\n' file1.txt

# Output
hello
to you

grep -o $'a\n' file1.txt

# Output
# Nothing

grep $'a\nb' file1.txt

# Output
# Nothing

$는 파일에 없지만 여전히 전체 파일을 인쇄하는 개행 문자가 뒤따른다는 것을 a\n의미합니까 ? a왜 그럴까요?

PS - -z옵션을 사용해도 동작은 동일합니다.

답변1

grep줄 바꿈으로 구분된 일련의 "패턴"(예: 하나 이상)을 허용하므로 grep $'a\n' infile다음과 같습니다.

grep 'a
' infile

또는 grep -e 'a' -e '' infile패턴 a(이 경우 일치하는 항목이 없음)을 제공한 다음 빈 패턴을 제공합니다.'' 모든 라인과 일치. 기사에도 언급되어 있어요GNU Grep 매뉴얼:

  1. 빈 패턴이 모든 입력 라인과 일치하는 이유는 무엇입니까?

    "grep" 명령은 패턴과 일치하는 문자열이 포함된 행을 검색합니다. 각 줄에는 빈 문자열이 포함되어 있으므로 빈 패턴으로 인해 "grep"이 각 줄에서 일치하는 항목을 찾습니다.


grep $'a\nb'동등하다

grep 'a
b' infile

또는 grep -e 'a' -e 'b' infile. 입력 내용에 일치하는 항목이 없으므로 아무 것도 인쇄되지 않습니다.


물어

모든 줄과 일치 하는데 ''왜 아무 것도 인쇄하지 않습니까 -o?

이것GNU 매뉴얼 페이지말했다(강조):

-o,--only-matching

    인쇄 일치만(비어있지 않음)선의 일부를 일치시키세요...

지금은 OSX에 액세스할 수 없지만 해당 매뉴얼 페이지에 이 내용이 언급되어 있을 것이라고 확신합니다.GNU Grep 매뉴얼. 일치하는 선의 일치하는 부분부터비었다,아무것도 인쇄되지 않습니다.

관련 정보