2017-03-14 4 views
1

Ich versuche, ein. Txt-Wörterbuch für alle trisyllabic Wurzeln zu suchen, und dann die übereinstimmenden Roots an eine neue TXT-Datei übergeben. Das fragliche Wörterbuch ist eine Rohtextversion von Heaths Nunggubuyu-Wörterbuch. Wenn ich die Datei in Atom (meinem bevorzugten Texteditor) durchsuche, macht der folgende String eine gute Arbeit, die gewünschten Wurzeln auszusondern und jegliches Material aus den Definitionen unter den Stichwörtern (die mit Leerzeichen beginnen) sowie jeglichem Englisch zu eliminieren Wörter und alle dreisilbigen Strings, die durch Bindestrich oder Gleichheitszeichen unterbrochen sind (was bedeutet, dass sie keine monomorphischen Wurzeln sind). Verzeih mir, wenn es klobig aussieht; Ich bin ein absoluter Anfänger. (‚:‘ In dieser Orthographie, Vokallänge wird mit einer angezeigt.., Und es gibt nur drei Vokale ‚a, i, u‘ Keiner der Stichwörter in Großbuchstaben hat)Regex für prosodisch definierte Wörter: Arbeiten in Atom, aber nicht grep

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

Ich brauche aber die übereinstimmende Zeichenfolgen, die an eine neue Datei ausgegeben werden sollen. Wenn ich versuche, dieselbe Zeichenfolge in grep (auf einem Mac) zu verwenden, wird nichts gefunden. Ich benutze die Syntax

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

Ich habe versucht, stundenlang gesucht, um herauszufinden, wie aus Atom regex Dialekt übersetzen grep (Mac), ohne Erfolg. Immer wenn es mir gelingt, Matches zu bekommen, sieht das Ergebnis völlig anders aus als ich es erwarte und was ich von Atom bekomme. Ich habe auch einige scheinbar grep-Tools für Atom angeschaut, aber die Dokumentation ist praktisch nicht existent, so dass ich nicht herausfinden kann, was sie überhaupt tun. Was mache ich hier falsch? Sollte ich eine Alternative zu Grep versuchen?

+0

Nach meiner Erfahrung benötigt Grep Regex Backslash vor Sonderzeichen, um sie zu verwenden. Normalerweise braucht man einen Backslash, um einem Charakter zu entkommen ... Ich habe auch beobachtet, dass bei einigen Unix-Distributionen ... – jraynal

Antwort

0

Vielleicht das einzige, was von Ihrem grep Befehl fehlt, ist die -E Option:

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

-E aktiviert Unterstützung für (modern) reguläre Ausdrücke erweitert, die Arbeit als man heutzutage erwartet (Duplikation Symbole + und ? Arbeiten wie erwartet, ( und ) Formularerfassungsgruppen, | ist Alternation).

Ohne -E (oder mit -G) Grund reguläre Ausdrücke angenommen werden - eine begrenzte Legacy-Form, die in der Syntax unterscheidet. Angesichts dieser -E is part of POSIX, gibt es keinen Grund nicht zu verwenden.

Auf macOS, grephat Charakter-Klasse Verknüpfungen verstehen wie \S und \W, und auch Wortgrenzen Behauptungen wie \b - dies steht im Gegensatz zu dem anderen BSD-Dienstprogramme, die macOS mit kommt, insbesondere sed und awk .


Es sieht nicht wie Sie es brauchen, aber PRCEs (Perl-compatible Regular Expressions) würden zusätzliche Funktionen wie look-around assertions bieten.

macOS grep sie nicht unterstützt, aber GNUgrep tut, über die -P Option. Sie können GNU grep unter Homebrew auf macOS installieren.

Alternativ können Sie einfach perl direkt verwenden; Das Äquivalent des obigen Befehls wäre:

regex='^\S[^aeiousf]*[aiu:]+[^csfaioeu:\-\=\W]+[aiu:]+[^VNcsfaeiou:\-\=]+[aiu:]+[^VcsfNaeiou:]*\b' 
perl -lne "print for m/$regex/g" Dict-nofrontmatter.txt > output.txt 
+0

Das funktionierte ziemlich perfekt, und die Erklärung war hilfreich. Vielen Dank! –

+0

@PeterNyhuisTorres: Freut mich zu hören; Gern geschehen. – mklement0

1

grep unterstützt verschiedene Regex-Stile. Von man re_format:

Reguläre Ausdrücke ("RE" s), wie in POSIX.2 definiert sind, kommen in zwei Formen :
moderne REs (etwa denen von egrep; POSIX.2 nennt diese erweitert REs) und
obsolete REs (grob die von ed (1); POSIX.2 grundlegende REs).

Grep hat Schalter um zu wählen welche Variante benutzt wird. Sortiert von weniger vielen Funktionen:

festen string:grep -F oder fgrep
überhaupt keine regex. Nur-Text-Suche.

Grund regex:grep -G oder nur grep
|, + und ? sind gewöhnliche Zeichen. | hat keine Entsprechung. Klammern müssen mit Escape-Zeichen versehen werden, um als Unterausdrücke zu fungieren.

erweiterten Reguläre Ausdrücke:grep -E oder egrep
"Normal" reguläre Ausdrücke mit |, +, ?Grenzen und so weiter.

perl regex:grep -P (für GNU grep, nicht vorinstalliert auf Mac)
Stärkster Regexes. Unterstützt Lookaheads und andere Funktionen.In Ihrem Fall sollten Sie grep -Eo "^\S... ausprobieren.