Ich brauche eine Möglichkeit, eine Datei mit grep über einen regulären Ausdruck in der Unix-Befehlszeile zu durchsuchen. Zum Beispiel, wenn ich in 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'
Aber wenn ich ein Wort eingebe, das nicht vorhanden ist, wird no matches found
es nicht gedruckt
Antworten:
Die natürliche Frage ist, warum nicht einfach grep verwenden?! Aber vorausgesetzt du kannst 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
anstattmatch
irgendwo in der Zeichenfolge zu finden,
) nach demprint
Entfernen des Wagenrücklaufs (Zeile hat einen)argv
Enthält den Namen der Python-Datei, daher müssen Variablen bei 1 beginnenDies behandelt nicht mehrere Argumente (wie es grep tut) oder erweitert Platzhalter (wie es die Unix-Shell tun würde). Wenn Sie diese Funktionalität wünschen, können Sie sie wie folgt 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,
quelle
Prägnant 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 viel Fehlerbehandlung), zB:
cat input-file | grep.py "RE"
Und hier ist der Einzeiler:
cat input-file | python -c "import re,sys;map(sys.stdout.write,(l for l in sys.stdin if re.search(sys.argv[1],l)))" "RE"
quelle
Adaptiert von einem Grep in Python .
Akzeptiert eine Liste von Dateinamen über
[2:]
, führt keine Ausnahmebehandlung durch:#!/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]
respsys.argv[2:]
funktioniert, wenn Sie es als eigenständige ausführbare Datei ausführen, was bedeutetchmod +x
zuerst
quelle
re.match
undre.search
?search
Anstattmatch
irgendwo in der Zeichenfolge zu finden"sys.argv
diese Option, um die Befehlszeilenparameter abzurufenopen()
,read()
um die Datei zu bearbeitenquelle
Sie könnten an Pyp interessiert sein . Unter Berufung auf meine andere Antwort :
quelle
Sie können Python-Textops3 verwenden:
from textops import * print('\n'.join(cat(f) | grep(search_term)))
Mit Python-Textops3 können Sie Unix-ähnliche Befehle mit Pipes verwenden
quelle
Das eigentliche Problem ist, dass die variable Zeile immer einen Wert hat. Der Test für "Keine Übereinstimmungen gefunden" besteht darin, ob eine Übereinstimmung vorliegt. Daher sollte der Code "if line == None:" durch "else:" ersetzt werden.
quelle