Wie kann ich Zeichenfolgen mit einfachen Anführungszeichen an grep übergeben?

Wie kann ich Zeichenfolgen mit einfachen Anführungszeichen an grep übergeben?

Mein gewünschtes Ergebnis ist das Folgende: Ich möchte ein Verzeichnis rekursiv durchsuchen und in allen gefundenen Dateien nach einer bestimmten Zeichenfolge suchen. Normalerweise verwende ich dafür den folgenden Befehl:

find ./ | xargs grep -ns 'foobar'

Wenn jedoch foobarAnführungszeichen vorhanden sind, schlägt der Befehl fehl und ich erhalte eine >Eingabeaufforderung in der Shell. Der spezifische Befehl, der das Problem verursacht, lautet wie folgt:

find ./ | xargs grep -ns 'add_action(\'save_post\','

Ich habe versucht, die Anführungszeichen mit Backslashs zu maskieren, aber ohne Erfolg. Wie mache ich das richtig?

Antwort1

Einfache Anführungszeichen werden durch einfache Anführungszeichen beendet; alle anderen Zeichen dazwischen bleiben genau so erhalten, wie sie sind, einschließlich Backslashs. Daher gibt es keine Möglichkeit, ein einfaches Anführungszeichen zwischen einfachen Anführungszeichen einzubetten. (Aber SiedürfenBeenden Sie die einfachen Anführungszeichen, maskieren Sie ein einfaches Anführungszeichen und beginnen Sie einen neuen Satz einfacher Anführungszeichen, wie in 'Single quotes aren'\''t ever really embedded in single quotes.')

Anregung:Vermeiden Sie find+xargs, wenn grep -r pattern .Sie rekursiv im aktuellen Verzeichnis greppen können.

Die folgenden Befehle haben ein gleichwertiges Verhalten:

grep -rns "add_action('save_post'," .
grep -rns 'add_action('\'save_post\', .

Der letzte Befehl wird wie folgt interpretiert:

  1. 'add_action('->add_action(
  2. \'->'
  3. save_post->save_post
  4. \'->'
  5. ,->,

Durch Aneinanderreihung dieser Teile greperhält der Befehl das Argument add_action('save_post',.

Antwort2

xargserwartet Argumente, die auf seltsame Weise zitiert werden, was findnichts ergibt. Verwenden Sie es nie xargsin Kombination mit find, es sei denn, Sie wissen, dass Ihre Dateinamen keine \"'Leerzeichen oder Zeichen enthalten.

Anstatt zu verwenden xargs, findrufen Sie direkt das Programm auf, das Sie ausführen möchten.

find . -exec grep -ns 'add_action('\''save_post'\'',' {} +

Bei exec … {} +wird das Programm wie bei einmal für viele Dateien gleichzeitig aufgerufen xargs. Einige ältere Versionen von findunterstützen dies +hier nicht¹, dann müssen Sie ;stattdessen verwenden, das grepeinmal pro Datei aufgerufen wird.

Sie können alternativ verwenden find … -print0 | xargs -0, wenn Ihre Dienstprogramme dies unterstützen¹. Die -print0Option weist an find, durch ein Nullbyte getrennte Namen auszugeben, und -0weist an xargs, nullgetrennte Eingaben zu erwarten und keine Anführungszeicheninterpretation durchzuführen.

Beachten Sie die Anführungszeichen oben: Zwischen einfachen Anführungszeichen werden alle Zeichen wörtlich interpretiert, außer dass dies 'das Ende der wörtlichen Zeichenfolge anzeigt. Dies '\''ist effektiv eine Möglichkeit, ein wörtliches einfaches Anführungszeichen in eine Zeichenfolge mit einfachen Anführungszeichen einzufügen. Formal lautet es „ 'Anführungszeichen beenden, \wörtliches 'einfaches Anführungszeichen, 'Anführungszeichen beginnen“.

Im Sonderfall von grepkönnen Sie, sofern Ihre Implementierung dies unterstützt¹, auf verzichten findund grep -rfür die rekursive Suche innerhalb eines Verzeichnisses verwenden:

grep -r 'add_action('\''save_post'\'',' .

¹ Linux, Cygwin, FreeBSD und OSX unterstützen diese Funktionen.

Antwort3

grep "add_action('save_post'," ./* -R
  1. Mit der Option können Sie alle Dateien im aktuellen Verzeichnis rekursiv durchsuchen -R.

  2. Suchzeichenfolge kann mit umgeben sein ".

verwandte Informationen