
Ich versuche, ein Skript (sagen wir script1.sh) zu schreiben, das die Zeilen findet, die die von mir eingegebenen Wörter enthalten, und zwar in Dateien, die sich in einem bestimmten Verzeichnis und dessen Unterverzeichnissen befinden, und zwar nur in den Dateien mit einer bestimmten Dateierweiterung. Das ./script1.sh python py this.is.what.i.look.for
sollte Ergebnisse wie diese liefern:
python/abc/file1.py:11: this.is.what.i.look.for and the line can contain other things as well
python/file2.py:412: this.is.what.i.look.for this.toggleButton.getElement())
Ich habe versucht, mit grep -r in den Unterverzeichnissen zu suchen und konnte die Zeilen finden.
grep -r -e $3 $1
gibt mir die Zeilen, aber es gelingt mir nicht, andere Dateien mit anderen Dateierweiterungen auszusortieren, und ich konnte keine Möglichkeit finden, $2 in den Code einzufügen. Außerdem habe ich es nicht geschafft, die Zeilennummern in die Mitte zu setzen. Ich habe versucht, die Ausgabe in zwei Teile aufzuteilen, so wie hier: python/abc/file1.py:
this.is.what.i.look.for and the line can contain other things as well
mit awk -F " " '{print $1}
, aber ich konnte sie nicht wieder zusammensetzen. Ich wollte die Teile der Ausgabe der Grep-Funktion Variablen zuweisen und sie dann wieder zusammensetzen, aber auch das hat nicht funktioniert. t1="grep -r -e $3 $1 | awk -F " " '{print $1}'"
Ich habe versucht, " ", ' ' ,$() zu verwenden, um Werte zuzuweisen, da ich nicht wusste, welches ich verwenden sollte, aber nichts davon hat funktioniert.
Antwort1
Zumindest unter GNU können Sie (und ) grep
verwenden, um die Übereinstimmungen in einem rekursiven grep einzuschränken, indem Sie einen Glob-Ausdruck im Shell-Stil verwenden:--include
--exclude
grep -r --include='*.py' -e pattern dir
Sie können die Nummerierung mit -n
oder --line-number
ergänzen. Denken Sie schließlich daran, die Positionsparameter in Anführungszeichen zu setzen - also
grep -nr --include="*.$2" -e "$3" "$1"