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해야 합니다.