Grep et Python
J'ai besoin d'un moyen de rechercher un fichier à l'aide de grep via une expression régulière à partir de la ligne de commande Unix. Par exemple quand je tape dans la ligne de commande:
python pythonfile.py 'RE' 'file-to-be-searched'
J'ai besoin de l'expression régulière 'RE'
à rechercher dans le fichier et imprimer les lignes correspondants.
Voici le code que j'ai:
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'
Mais quand je rentre un mot qui n'est pas présent, no matches found
ne pas imprimer
- Si vous voulez vraiment pour python-style expressions régulières dans grep, le --perl-regex option à la commande grep est vraiment proche. Il vous donne perl-style de support des expressions régulières. (Aussi, mon préféré sous-utilisé en option pour la commande grep est --color=toujours )
Vous devez vous connecter pour publier un commentaire.
La question est pourquoi ne pas simplement utiliser grep?! Mais en supposant que vous ne pouvez pas...
Choses à noter:
search
au lieu dematch
pour trouver n'importe où dans la chaîne de,
) aprèsprint
supprime le retour chariot (ligne vous en avez un)argv
comprend python nom de fichier, de sorte que les variables doivent commencer à 1Ce n'est pas de gérer plusieurs arguments (comme grep ne) ou développer des caractères génériques (comme Unix shell). Si vous voulais cette fonctionnalité, vous pouvez l'obtenir en utilisant les éléments suivants:
print(line,)
ne serait pas supprimer les sauts de ligne supplémentaires. Cependant, pour tous la compréhension de liste les accros de là, cela fonctionne très bien, et supprime les sauts de ligneprint(''.join([line for line in open(sys.argv[2], 'r') if re.search(sys.argv[1], line)]))
Concis et efficace en terme de mémoire:
Il fonctionne comme egrep (sans trop d'erreur de manipulation), par exemple:
Et voici le one-liner:
Adapté à partir d'un grep en python.
Accepte une liste de noms de fichiers via
[2:]
, ne fait pas exception manipulation:sys.argv[1]
respsys.argv[2:]
fonctionne, si vous exécutez un fichier exécutable autonome, senschmod +x
première
re.match
etre.search
?search
au lieu dematch
pour trouver n'importe où dans la chaîne"sys.argv
pour obtenir les paramètres de ligne de commandeopen()
,read()
pour manipuler les fichierVous pourriez être intéressé par pp. Citant mes autres réponse:
Le vrai problème est que la variable de la ligne a toujours une valeur. Le test de la "aucun résultat trouvé" est de savoir si il y a un match, de sorte que le code "if ligne == None:" doit être remplacé par "les autres:"