유닉스에 매우 익숙하지만 프로그래밍에는 새로운 것이 아니다. MacBook에서 터미널 사용. 크로스 워드 생성을 위해 단어 목록을 관리하고 검색하기 위해 Grep 명령과 그 변형을 사용하려고합니다. 매우 간단 해 보이지만 간단한 경우라고 생각한 것에 대해 일찍 끊어졌습니다.
내가 들어갈 때
grep "^COW" masternospaces.txt
COW로 시작하는 모든 단어 목록 : 내가 원하는 것을 얻습니다.
하지만 내가 들어갈 때
grep "COW$" masternospaces.txt
나는 COW로 끝나는 단어 목록을 얻을 것으로 예상합니다 (많은 단어가 있습니다).
파일은 일반 텍스트 파일이며 모든 줄에는 모든 대문자로 된 단어 (또는 공백이없는 단어 문구) 만 있습니다.
여기서 무슨 일이 일어날 지 아십니까?
답변
@steeldriver가 언급했듯이 문제는 예상과 다른 라인 엔딩 스타일로 인해 발생할 수 있습니다 grep
.
줄 끝을 확인하려면
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
하면 어디서 얻을 수 있습니다.
도움이 되었기를 바랍니다!
답변
grep과 함께 ‘표준’RegEx 구문을 사용할 수 있지만 ( @ user43791의 답변 에서처럼 ) grep에는 입력 경계를 나타내는 다른 식별자도 있습니다.
전체 줄의 시작과 끝에 대한 매처는 \`
(대신 ^
) 대신 () 대신 ( )와 \'
(아포스트로피 $
)입니다.
따라서 원래 명령의 경우 다음을 사용합니다.
grep "COW\'" masternospaces.txt
사이드 노트 : 그것은주의하는 것도 중요 ?
하고 +
당신이 그 (것)들을 사용하여 탈출하지 않는 한 그대로 처리됩니다 \?
그리고 \+
그들에게 그들의 정규식 스타일 선택기 대응을 할 수 있습니다.
출처 : grep
정규식 구문
답변
\r
grep 이전 을 제거하는 다른 방법 :
... | dos2unix | egrep 'COW$' | ...
나는 [[:cntrl:]]
오랫동안 같은 것들을 기억하지 못하기 때문에 그것이 매우 분명하다는 것을 좋아 합니다.
답변
bash가 grep에 대한 매개 변수를 설정할 때 “COW $”는 “$”를 “”로 취급하는 “COW”로 해석되었으며, $는 이탈 심볼입니다. $로 대화하지 않은 경우 bash 셸에서 빈 문자열로 해석되므로 grep ‘COW $’masternospaces.txt를 대신 사용해야합니다.
답변
BSD grep에서는 “$”를 이스케이프하고 문자열을 큰 따옴표로 묶어야합니다.
"COW\$"