2016-07-16 11 views
1

Kollokation -> n A maka (Kollokation -> Wörter, Wörter -> Wortwörter, Wort -> n A (Wort -> Zeichen, Zeichen -> Zeichen Char, Zeichen -> 'n ', Chars -> Char, Char ->' A '), Wörter -> Wortwörter, Wort -> ma (Wort -> Zeichen, Zeichen -> Zeichen Char, Zeichen ->' m ', Zeichen -> Zeichen, Zeichen -> 'a'), Wörter -> Wort, Wort -> ka (Wort -> Zeichen, Zeichen -> Zeichen Char, Zeichen -> 'k', Zeichen -> Zeichen, Zeichen -> 'a'))Mustervergleich in einer Datei

Ich habe eine Datei mit 1000s Zeile wie folgt. Ich möchte das Muster wie dieses suchen „Wort -> n A (“ das heißt,

  1. es mit beginnen sollte „Wort ->“
  2. Danach wird es eine beliebige Anzahl von Buchstaben in jedem Fall enthalten
  3. endet mit einer Öffnung Klammer "("

Beispiel von oben Linie ich will,

  1. Wort -> n A (
  2. Wort -> ma (
  3. Wort -> ka (

ich diesen Befehl grep versucht haben: grep -kein "Wort -> * (" Dateiname

Aber es gibt, wie Dieses:

Wort -> n A (Word -> Chars, Chars -> Char Chars, Char -> 'n', Chars -> Char, Char -> 'A'), Words -> wort , Wort -> ma (Wort -> Zeichen, Zeichen -> Zeichen Char, Zeichen -> 'm', Zeichen -> Zeichen, Zeichen -> 'a'), Wörter -> Wort, Wort -> ka (

Auch ich möchte alle das passende Muster in einer Zeile kommt in einer Zeile in der Ausgabedatei.

Auch vorschlagen, wenn es mit einer anderen Methode durchgeführt werden kann.

Antwort

0
$ grep -no 'Word -> [[:alpha:] ]\+(' file 
1:Word -> n A (
1:Word -> m a (
1:Word -> k a (

Das obige zeigt die Zeilennummern in der ursprünglichen Datei, in der die Regex übereinstimmte. Wenn stattdessen wollen Sie Streichhölzer fortlaufend nummeriert, dann:

$ grep -o 'Word -> [[:alpha:] ]\+(' file | cat -n 
    1 Word -> n A (
    2 Word -> m a (
    3 Word -> k a (

Der ursprüngliche Code verwendet .*. Es gibt zwei Probleme damit. Einer ist, dass . alles entspricht einschließlich (. Die zweite ist, dass die Regex gierig ist: Sie entspricht der längsten übereinstimmenden Zeichenfolge.

Hier, anstelle von .*, haben wir [[:alpha:] ]\+ verwendet. Dies entspricht einem oder mehreren Buchstaben und Leerzeichen. Da dies nur Buchstaben und Leerzeichen entspricht, passt es nicht ( und damit wird die Übereinstimmung die gewünschte Länge sein.

Beachten Sie, dass wir [:alpha:] verwenden, um Buchstaben zu finden. Im Gegensatz zu älteren Formen wie [a-zA-Z] ist [:alpha:] Unicode-sicher.

Das Problem mit der Verwendung .* ist, dass es gierig ist: es wird die längste mögliche Übereinstimmung übereinstimmen. Sie scheinen die kürzeste Übereinstimmung zu haben.

+1

danke, es hat funktioniert :) –