줄 시작 ^ 앵커는 작동하지만 줄 끝 $ 앵커는 grep 명령과 함께 작동하지 않는 이유는 무엇입니까?

줄 시작 ^ 앵커는 작동하지만 줄 끝 $ 앵커는 grep 명령과 함께 작동하지 않는 이유는 무엇입니까?

UNIX에는 매우 새로운 것이지만 프로그래밍에는 새로운 것은 아닙니다. MacBook에서 터미널을 사용하세요. 십자말 풀이로 구성된 단어 목록을 관리하고 검색하기 위해 Grep 명령과 그 변형을 사용해 보았습니다. 충분히 간단해 보이지만 간단한 사례여야 한다고 생각했던 일이 초기에 막혔습니다.

내가 들어갈 때

grep "^COW" masternospaces.txt

나는 내가 원했던 것을 얻었습니다. COW로 시작하는 모든 단어의 목록이었습니다.

하지만 내가 들어갈 때

grep "COW$" masternospaces.txt

COW로 끝나는 단어 목록(많은 단어가 있음)을 얻을 것으로 예상했지만 아무것도 반환되지 않았습니다.

파일은 일반 텍스트 파일이며, 각 줄은 모두 대문자로 된 한 단어(또는 공백이 없는 단어 구문)입니다.

여기서 무슨 일이 일어나는지 아시나요?

답변1

grep@steeldriver가 언급했듯이 예상과 다른 줄 끝 스타일로 인해 문제가 발생할 수 있습니다 .

줄 끝 확인

이를 사용하여 hexdump줄 끝의 형식이 어떻게 지정되었는지 정확하게 확인할 수 있습니다. 내가 가장 좋아하는 형식을 사용하는 것이 좋습니다.

hexdump -e '"%08_ad (0x%08_ax)    "8/1 "%02x ""   "8/1 "%02x "' -e '"    "8/1 "%_p""|"8/1 "%_p""\n"' masternospaces.txt

출력에서 줄 끝( 0a-> LF, 0d-> ) 을 확인하세요 CR. 매우 간단한 예는 다음과 같습니다.

$ hexdump -e '"%08_ad (0x%08_ax)    "8/1 "%02x ""   "8/1 "%02x "' -e '"    "8/1 "%_p""|"8/1 "%_p""\n"' masternospaces.txt
00000000 (0x00000000)    4e 6f 20 43 4f 57 20 65   6e 64 69 6e 67 0d 0a 45    No COW e|nding..E
00000016 (0x00000010)    6e 64 69 6e 67 20 69 6e   20 43 4f 57 0d 0a          nding in| COW..

dos 형식의 줄 끝을 참고하세요: 0d 0a.

줄 끝 변경

너는 볼 수있어여기또는여기다양한 도구를 사용하여 줄 끝을 변경하는 다양한 방법이 있지만 일회성 작업에는 항상 vi/vim을 사용할 수 있습니다.

vim masternospaces.txt
:set fileformat=unix
:wq

grep은 변경 사항이 없습니다

grep줄 끝과 관계없이 일치시키려는 경우 항상 다음과 같이 줄 끝을 지정할 수 있습니다.

grep 'COW[[:cntrl:]]*$' masternospaces.txt

빈 줄이 표시되면 -v다음 옵션을 사용하여 실제로 일치하는 항목이 있는지 확인할 수 있습니다 cat.

grep 'COW[[:cntrl:]]*$' masternospaces.txt | cat -v

내가 개인적으로 좋아하는

grep을 사용하여 출력을 정규화할 수도 있습니다 sed.

sed -n '/COW^M*$/{;s/^M//g;p;};' masternospaces.txt

^M키보드 입력을 통해 얻을 수 있는 위치 .Ctrl-V Ctrl-M

도움이 되었기를 바랍니다!

답변2

\r이전에 grep을 제거하는 또 다른 방법:

... | dos2unix | egrep 'COW$' | ...

[[:cntrl:]]나는 사물을 오랫동안 기억하지 못하기 때문에 그것이 매우 명확하다는 것을 좋아합니다 .

답변3

grep과 함께 "표준" 정규식 구문을 사용할 수 있지만(예:@user43791의 답변), grep에는 입력 경계를 나타내는 다른 식별자가 있습니다.

전체 줄의 시작과 끝을 나타내는 일치자는 \`(대신에 백틱) ^\'(대신에 아포스트로피 $)입니다.

따라서 원래 명령의 경우 다음을 사용합니다. grep "COW\'" masternospaces.txt

참고 사항: and 로 이스케이프 처리하지 않는 한 ?및 는 +문자 그대로 처리되어 정규식 스타일 선택기 대응 항목이 됩니다.\?\+

원천:grep정규식 구문

답변4

"COW$" bash가 grep에 대한 매개변수를 설정하면 "COW"로 해석됩니다. 여기서 $는 이스케이프 기호이므로 "$"는 ""로 처리됩니다. $에 아무것도 없으면 bash 쉘은 이를 빈 문자열로 해석하므로 대신 'COW$' masternospaces.txt를 grep해야 합니다.

관련 정보