2017-03-14 12 views
1

모든 삼손의 뿌리에 대한 .txt 사전을 검색하고 일치하는 루트를 새 .txt 파일로 전달하려고합니다. 문제의 사전은 Heath의 Nunggubuyu 사전의 원시 텍스트 버전입니다. Atom (필자가 선호하는 텍스트 편집기)에서 파일을 검색 할 때 다음 문자열은 원하는 루트를 선택하고 표제 (공백으로 시작하는) 아래의 정의에서 모든 내용을 제거하고 영어 단어 및 하이픈 또는 등호 (즉 단일 모달의 뿌리가 아님)로 중단 된 모든 삼 변태 끈. 그것이 clunky 경우에 저를 용서하십시오; 나는 절대적인 초보자입니다. (':'이 맞춤법에서는 모음의 길이가 함께 표시됩니다.. 그리고 표제어의 'A, I, U'없음 대문자가없는 세 개의 모음이있다)계보로 정의 된 단어의 정규식 : Atom에서 작동하지만 grep이 아닙니다.

^\S[^aeiousf]*[aiu:]+[^csfaioeu:\-\=\W]+[aiu:]+[^VNcsfaeiou:\-\=]+[aiu:]+[^VcsfNaeiou:]*\b 

을하지만, 나는 필요 일치하는 문자열을 새 파일로 출력합니다. grep에서이 동일한 문자열을 사용하려고하면 (Mac에서는) 아무 것도 일치하지 않습니다. 나는 아무 소용, 내가 grep으로하는 아톰의 정규식 방언에서 (Mac)를 번역하는 방법을 알아 내려고 시간을 찾고 있었어요 구문

grep -o "^\S[^aeiousf]*[aiu:]+[^csfaioeu:\-\=\W]+[aiu:]+[^VNcsfaeiou:\-\=]+[aiu:]+[^VcsfNaeiou:]*\b" Dict-nofrontmatter.txt > output.txt 

를 사용합니다. 내가 성냥을 잡을 때마다, 결과는 내가 기대하는 것과는 크게 다르게 보입니다. 또한 Atom을위한 일부 명백한 grep 도구를 살펴 봤지만 문서가 사실상 존재하지 않으므로 내가 할 수있는 것을 해결할 수는 없습니다. 나는 여기서 무엇이 잘못 되었는가? grep에 대한 대안을 시도해야합니까?

+0

내 경험상 grep 정규식에는 특수 문자를 사용하기 전에 백 슬래시가 필요합니다. 보통 당신은 문자를 이스케이프하기 위해 백 슬래시가 필요합니다 ... 나는 또한 유닉스 배포판에서 찾아 보았습니다 ... – jraynal

답변

0

은 아마도 당신의 grep 명령에서 누락 된 유일한 것은 -E 옵션입니다 예상대로 작동, () 양식 캡처 그룹, |은 교대입니다.

-E (또는 -G)와 기본 정규식은 가정없이 - 구문 다르다 제한된 레거시 형태. -E is part of POSIX을 감안할 때 이 아닌 이유는 없습니다.입니다. 이 맥 OS는 특히 sedawk, 함께 제공되는 다른 BSD 유틸리티와 대조적이다 - 맥 OS에

, grep \S\W, 및 \b으로도 단어 경계 주장과 같은 문자 클래스의 바로 가기를 이해 않는다 .


당신이 그것을 필요로 그것은 마치 보이지 않는,하지만 PRCEs (Perl-compatible Regular Expressions)look-around assertions 같은 추가 기능을 제공한다.

macOS grep은 지원하지 않지만 GNUgrep-P 옵션을 통해 지원됩니다. Homebrew을 통해 macOS에 GNU grep을 설치할 수 있습니다.

또는 perl을 직접 사용할 수도 있습니다. 위의 명령에 해당하는 것은 다음과 같습니다.

+0

그게 거의 완벽하게 작동하고 설명은 도움이되었다. 고맙습니다! –

+0

@PeterNyhuisTorres : 듣기 좋게; 천만에요. – mklement0

1

grep은 다양한 정규식을 지원합니다. man re_format에서 : 약
현대 RES (egrep을들; POSIX.2이 RE가 확장 호출 POSIX.2에 정의 된

정규 표현식 ("RE"의), 두 형태로 제공) 및
RE (약 ed (1); POSIX.2 basic REs)가 있습니다.

Grep에는 어떤 변형이 사용되는지 선택하는 스위치가 있습니다. 많은 기능에 더 적은에서 정렬 기준 :

고정 문자열 :grep -F 또는 모든 fgrep
없음 정규 표현식. 일반 텍스트 검색.

기본 정규식 :grep -G하거나 grep
|, +?는 일반 문자입니다. |에는 해당 항목이 없습니다. 하위 식으로 작동하려면 괄호를 이스케이프 처리해야합니다.

확장 정규식 : |, +, ?경계 등으로grep -E 또는 egrep
"일반"정규 표현식에.

펄 정규식 : grep -P을 (GNU 그렙 (grep)에 대한 맥에 사전 설치되어 있지 않은)
대부분의 강력한 정규 표현식에. 미리보기 및 기타 기능을 지원합니다.

귀하의 경우에는 grep -Eo "^\S...을 시도해야합니다. 한 요즘 (중복 기호 +? 기대로 작업 (현대) 정규 표현식을 확장하기위한

regex='^\S[^aeiousf]*[aiu:]+[^csfaioeu:\-\=\W]+[aiu:]+[^VNcsfaeiou:\-\=]+[aiu:]+[^VcsfNaeiou:]*\b' 
grep -Eo "$regex" Dict-nofrontmatter.txt > output.txt 

-E 지원을 활성화 :