it-swarm.com.de

Grep und Python

Ich brauche eine Möglichkeit, eine Datei mit grep über einen regulären Ausdruck von der Unix-Befehlszeile aus zu suchen. Zum Beispiel, wenn ich die Befehlszeile eingebe:

python pythonfile.py 'RE' 'file-to-be-searched'

Ich brauche den regulären Ausdruck 'RE', um in der Datei gesucht zu werden und die passenden Zeilen auszudrucken.

Hier ist der Code, den ich habe:

import re
import sys

search_term = sys.argv[1]
f = sys.argv[2]

for line in open(f, 'r'):
    if re.search(search_term, line):
        print line,
        if line == None:
            print 'no matches found'

Wenn ich jedoch ein nicht eingegebenes Wort eingebe, wird no matches found nicht gedruckt

56
David

Die natürliche Frage ist, warum grep nicht einfach grep ?! Aber angenommen, Sie können nicht ...

import re
import sys

file = open(sys.argv[2], "r")

for line in file:
     if re.search(sys.argv[1], line):
         print line,

Dinge zu beachten:

  • search statt match, um irgendwo im String zu suchen
  • komma (,) nach print entfernt Wagenrücklauf (Zeile hat einen)
  • argv enthält den Namen der Python-Datei, daher müssen die Variablen bei 1 beginnen

Dies behandelt nicht mehrere Argumente (wie Grep) oder erweitert Platzhalter (wie die Unix-Shell). Wenn Sie diese Funktionalität wünschen, können Sie sie folgendermaßen erhalten:

import re
import sys
import glob

for arg in sys.argv[2:]:
    for file in glob.iglob(arg):
        for line in open(file, 'r'):
            if re.search(sys.argv[1], line):
                print line,
69
Nick Fortescue

Kurz und speichereffizient:

#!/usr/bin/env python
# file: grep.py
import re, sys

map(sys.stdout.write,(l for l in sys.stdin if re.search(sys.argv[1],l)))

Es funktioniert wie egrep (ohne zu viele Fehlerbehandlung), z.

cat file-to-be-searched | grep.py "RE"

Und hier ist der One-Liner:

cat file-to-be-searched | python -c "import re,sys;map(sys.stdout.write,(l for l in sys.stdin if re.search(sys.argv[1],l)))" "RE"
10

Angepasst von einem grep in python .

Akzeptiert eine Liste von Dateinamen über [2:], keine Ausnahmebehandlung:

#!/usr/bin/env python
import re, sys, os

for f in filter(os.path.isfile, sys.argv[2:]):
    for line in open(f).readlines():
        if re.match(sys.argv[1], line):
            print line

sys.argv[1] bzw. sys.argv[2:] funktioniert, wenn Sie es als eigenständige ausführbare Datei ausführen, was bedeutet 

chmod +x 

zuerst

5
miku
  1. verwenden Sie sys.argv, um die Befehlszeilenparameter abzurufen
  2. verwenden Sie open(), read(), um die Datei zu bearbeiten
  3. verwenden Sie das Python re-Modul , um die Zeilen abzugleichen
4
jldupont

Möglicherweise interessieren Sie sich für pyp . Zitieren meiner anderen Antwort

"The Pyed Piper" oder pyp ist eine Textmanipulation für Linux-Befehlszeilen Werkzeug ähnlich wie awk oder sed, verwendet jedoch die Standard-Python-Zeichenfolge und Listenmethoden sowie benutzerdefinierte Funktionen wurden entwickelt, um schnell .__ zu generieren. führt zu einer intensiven Produktionsumgebung.

2
Piotr Dobrogost

Das eigentliche Problem ist, dass die Variablenzeile immer einen Wert hat. Der Test für "Keine Übereinstimmungen gefunden" besteht darin, ob eine Übereinstimmung vorliegt. Der Code "if line == None:" sollte durch "else:" 

0
richard