BASH - grep - funktioniert in der Befehlszeile, jedoch nicht in Skripts
5023
Walter
Ich versuche, die Anzahl der Vorkommen in einem Skript zu ermitteln. Wenn der Befehl in der Befehlszeile ausgeführt wird, funktioniert er einwandfrei, aber nicht in einem Skript. Beide Variablen werden initialisiert. FILE_PATH ist der absolute Pfad der Datei und VARIABLE_NAME ist in etwa firstName oder lastName.
Wenn ich $ VARIABLE_NAME aus dem Skript nehme und direkt durch das, was ich suche, ersetze, funktioniert es wie erwartet, daher ist es etwas mit dem Ersatz.
Irgendwelche Ideen, was ich ausprobieren kann?
Ist das wirklich alles, was diese Zeile in Ihrem Skript macht, drucken Sie die Anzahl der Vorkommen in stdout oder ist es Teil eines größeren Befehls?
garyjohn vor 13 Jahren
0
Es ist Teil eines größeren Befehls, aber ich kann diesen Teil nicht zum Laufen bringen.
Walter vor 13 Jahren
0
Mein Punkt war, dass, wenn ein Befehl an einer Shell-Eingabeaufforderung, aber nicht innerhalb eines Skripts ausgeführt wird, sich diese beiden Umgebungen unterscheiden und dass es für die Antwort möglicherweise wichtig ist, mehr über den Kontext zu erfahren, in dem der Befehl in der Befehlszeile ausgeführt wird Skript.
garyjohn vor 13 Jahren
0
Das Problem scheint in Ihrem Regex zu liegen. Können Sie uns zeigen, was Sie erreichen wollen?
Wenn Sie versuchen, Konstrukte wie folgt zusammenzubringen:
this.contentOfVar contentOfVar
probiere es mit folgendem:
grep -cP "(this\.|\s)$VARIABLE_NAME" $FILE_PATH
Das funktioniert in GNU grep. Sie müssen nicht angeben , da der Standardwert 1 ist. Wenn das -PFlag aktiviert ist, \(und \)in der Zeichenfolge wörtliche Klammern angegeben wird, da dies das Perl-Verhalten ist.
Ah, Sie hatten recht, es ist eine Variable, die einen Unterstrich enthält, der Probleme verursacht.
Walter vor 13 Jahren
0
0
h0tw1r3
Es sieht so aus, als ob das Problem mit dem Escape von Regex ist. Hier ist ein vollständiges Arbeitsbeispiel, wie ich so etwas tun würde.
#!/bin/bash VARIABLE_NAMES=(testOne testTwo) RE="(this\.|\s)" cat > ./testfile.txt <<EOF this.testOne this.testTwo this.testTwo this.testOne this.testTwo EOF for VARIABLE_NAME in $; do grep -cP "$$" testfile.txt done exit 0
0
pbsmind
Es geht darum, die Anführungszeichen und Schrägstriche zu umgehen:
Ich habe das Echo als Beispiel hinzugefügt, um zu zeigen, wie es tatsächlich interpettiert wird.
0
Brian Vandenberg
Um die Antworten anderer hinzuzufügen, würde ich die Verwendung von einfachen Anführungszeichen vorschlagen, sofern Sie nicht ausdrücklich etwas von einer Variablen benötigen. Zum Beispiel: