BASH - grep - funktioniert in der Befehlszeile, jedoch nicht in Skripts

4892
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.

VARIABLE_NAME="_firstName"  grep -cP "\(this\.|\s\)$VARIABLE_NAME" $FILE_PATH 

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?

2
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 12 Jahren 0
Es ist Teil eines größeren Befehls, aber ich kann diesen Teil nicht zum Laufen bringen. Walter vor 12 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 12 Jahren 0

4 Antworten auf die Frage

2
Yab

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 12 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:

VARIABLE_NAME="_firstName" FILE_PATH="/tmp/*" echo grep -cP \"\\\(this\\\.\|\\\s\\\)$\" $FILE_PATH grep -cP \"\\\(this\\\.\|\\\s\\\)$\" $FILE_PATH 

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:

#!/usr/bin/env bash  dosomething | grep -cP 'some stuff'$'more stuff'; 

Wenn Sie einfache Anführungszeichen in der Regex benötigen, sieht das etwas hässlicher aus:

# ... dosomething | grep -cP 'some stuff'"'"'this part has a single-quote around it'"'"$'more stuff'; 

Der Vorteil der Verwendung von einfachen Anführungszeichen besteht darin, dass Sie nichts entziehen müssen.

-Brian