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 foobar
Anfü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:
'add_action('
->add_action(
\'
->'
save_post
->save_post
\'
->'
,
->,
Durch Aneinanderreihung dieser Teile grep
erhält der Befehl das Argument add_action('save_post',
.
Antwort2
xargs
erwartet Argumente, die auf seltsame Weise zitiert werden, was find
nichts ergibt. Verwenden Sie es nie xargs
in Kombination mit find
, es sei denn, Sie wissen, dass Ihre Dateinamen keine \"'
Leerzeichen oder Zeichen enthalten.
Anstatt zu verwenden xargs
, find
rufen 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 find
unterstützen dies +
hier nicht¹, dann müssen Sie ;
stattdessen verwenden, das grep
einmal pro Datei aufgerufen wird.
Sie können alternativ verwenden find … -print0 | xargs -0
, wenn Ihre Dienstprogramme dies unterstützen¹. Die -print0
Option weist an find
, durch ein Nullbyte getrennte Namen auszugeben, und -0
weist 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 grep
können Sie, sofern Ihre Implementierung dies unterstützt¹, auf verzichten find
und grep -r
fü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
Mit der Option können Sie alle Dateien im aktuellen Verzeichnis rekursiv durchsuchen
-R
.Suchzeichenfolge kann mit umgeben sein
"
.