2016-08-01 19 views
0

Ich möchte an Grep Befehl übergeben (in einem Bash-Skript), die Dateierweiterungen zu suchen, mit - include Argument. Diese Dateierweiterungen werden vom Benutzer über die Befehlszeile als Argument eingegeben (das vierte Argument enthält Dateierweiterungen in einer kommagetrennten Weise).übergeben Variable Wert an - include Argument mit grep Befehl innerhalb Bash-Skript

Das ist mein Skript:

... 
echo "Searching in ${4} files for pattern" 
egrep -irn . --include=\*.{"${4}"} --exclude=\*.{class} -e "${3}" 
... 

Ich habe auch versucht, einen String mit dem Befehl Erstellen und eval Aufruf wie folgt aus:

... 
comando="egrep -irn . --include="\\*.{${4}}" --exclude=\*.{class} -e "${3}"" 
echo $comando 
resultado=eval $comando 
echo $resultado 

(wenn comando Echo i diese: egrep -inn. --include = *. {wsdl, xml} --exclude = *. {class} -e Text, der genau das Kommando ist, das bei der Ausführung in der Befehlszeile einige Übereinstimmungen zurückgibt.

Ich habe auch versucht, eine Variable mit allen vorbei Include Argument:

... 
argumento="\\*.{${4}}" 
egrep -irn . --include=$argumento --exclude=\*.{class} -e "${3}" 
... 

Dies ist, wie das Skript von der Kommandozeile aufgerufen wird:

sh ./searchRecursiveIterativeEgrep.sh/tmp/test/andere// usr/local/aux/"text" wsdl, xml

Irgendwelche Ideen, wie man das erreicht? Vielen Dank

+1

Das UNIX-Tool zum Suchen von Dateien hat den passenden Namen 'find', nicht' grep'. Vergiss, du hast schon mal gesehen, dass GNU-Greps-Optionen zum Suchen von Dateien eine schreckliche Idee waren (Whats next - grep Optionen, um die Ausgabe zu sortieren) und benutze 'find' um Dateien zu finden und' grep' um ** G ** lobal zu suchen für eine ** R ** egular ** E ** xpression in einer Datei und ** P ** rint den passenden Text. Dein Leben wird viel einfacher sein. –

+0

Ich versuche einen regulären Ausdruck in Dateien zu finden, also brauche ich grep. Der Befehl funktioniert wie erwartet, aber ich kann nicht mit Argumenten von der Befehlszeile arbeiten. –

+0

a) grep ist nicht das einzige Werkzeug, das reguläre Ausdrücke in Dateien finden kann und b) Ich schlage nicht vor, dass Sie grep nicht benutzen, um reguläre Ausdrücke in Dateien zu finden. Ich schlage vor, dass Sie grep nicht verwenden Dateien, da dies der falsche Ansatz ist und Ihren grep-Befehl lächerlich kompliziert macht. Verwenden Sie 'find', um die Dateien zu finden, und' grep' (oder ein anderes Tool), um in den gefundenen Dateien nach regexps zu suchen. Etwas in der Art von 'finden. -name '* .extension' -print0 | xargs -0 grep 'regexp''. –

Antwort

0

Ich habe gerade verstanden, warum Sie ein Problem hatten: Wenn ich den generierten Befehl kopieren/einfügen, funktioniert es, aber innerhalb einer Shell tut es nicht.

So schlage ich vor, als Behelfslösung

argumento="\\*.{${4}}" 
echo egrep -irn . --include=$argumento --exclude=\*.{class} -e "${3}" | sh 

(das Echo auf eine neue Schale kochend tut es: es funktioniert). Vielleicht ist es nicht die beste Antwort, aber es macht den Job.

Vielleicht kann jemand das erklären, oder mit einer besseren, saubereren Antwort kommen.

+0

Dieser Befehl funktioniert in der Befehlszeile mit Mehrfacherweiterung. egrep -irn. --include = \ *. {wsdl, xml} --exclude = \ *. {Klasse} -e Text –

0

Sie keinen Abtastwerteingang oder erwartete Ausgabe vorsah, so ist dies offensichtlich nicht getestet, aber der richtige Ansatz ist find zu FIND Dateien und grep zu G lobally für eine R egular E Suche verwenden xpression in einer Datei und P rint den passenden Text (siehe die Hinweise in ihren Namen ;-)). Etwas wie:

find . -type f -name "*.$4" -print0 | xargs -0 grep -Ein "$3" 

Mann finden, xargs und grep für weitere Einzelheiten.