Ich suche nach Dateien basierend auf einem regulären Ausdruck und versuche dann, diese Dateien nach Inhalten zu durchsuchen. So habe ich zum Beispiel so etwas
#Find all C++ files that match a certain pattern and then search them
find . -name "*.cpp" | grep "<name regex>" | xargs grep "<content regex>"
Das Problem, auf das ich stoße, ist, dass einige der Pfade Leerzeichen enthalten, was verwirrt xargs
. Ich weiß, dass ich, wenn ich nur verwenden würde find
, das -print0
Argument (zusammen mit dem -0
Argument on xargs
) verwenden könnte, um zu verhindern, dass xargs Leerzeichen als Trennzeichen behandelt. Gibt es etwas ähnliches mit grep
?
Oder gehe ich dieses Problem völlig falsch an? Naiv, find
um grep
für xargs grep
mich Sinn zu machen, aber ich bin offen für andere Ansätze, die die gleichen Ergebnisse liefern.
xargs
indem Sie-i
Parameter, a lacat sample.txt | grep "pat t ern" | xargs -i grep "{}"
- die geschweiften Klammern sagen sie , wo das Argument zu positionieren. Das Handbuch sagt mir, dass-i
es veraltet ist,-I
also lohnt es sich vielleicht auch, einen Blick darauf zu werfen.Antworten:
Verwenden Sie so etwas vielleicht (wenn gnu grep).
Mann grep
Siehe auch die Optionen für Nulltrennzeichen.
quelle
grep -r include='*.cpp'
es sich um einen Shell-Glob handelt - und damit um ein Feature-ausgerichtetes W /find . -name '*.cpp' -exec grep -e 'content_pattern' -- {} \;
Nicht-W /find . -name '*.cpp' | grep 'name_pattern' | xargs grep 'content_pattern'
Wenn Sie durch viele Reifen springen müssen, geht die Effizienz von xargs trotzdem verloren. Hier ist eine grobe Lösung:
Jedes Mal, wenn ich auf Probleme mit Leerzeichen in Dateinamen stoße, lautet die Antwort doppelte Anführungszeichen für eine Variable.
quelle
Verwenden Sie
find
diese Option , um alle Dateinamen zu filtern. Eher, alstun
Wenn Sie etwas etwas komplizierteres tun möchten, wie
du kannst tun
Beachten Sie, dass diese auch für Dateien mit Zeilenumbrüchen im Namen funktionieren sollten.
Und wenn Sie die Kraft ausgewachsener regulärer Ausdrücke benötigen, können Sie diese verwenden
-regex
.quelle
Dies sollte auch ohne GNU-Tools funktionieren:
Der
perl
Aufruf ersetzt Zeilenumbrüche durch Nullzeichen, wodurchxargs -0
die Eingabe pro Zeile und nicht pro Leerzeichen interpretiert werden kann.GNU verwenden, können Sie den entfernen
perl
Anruf und ändernxargs -0 …
zuxargs -d "\n" …
Nicht haben
perl
oder GNU? Versuchen Sie esawk '{printf "%s%c", $0, 0}'
stattdessen.quelle
xargs -d "\n"
. Dies ist ein sehr ungewöhnliches Ereignis. Wenn Sie jedoch keine Kontrolle über die Daten haben und befürchten, dass dies ein Sicherheitsrisiko darstellt, sollten Sie die Ausgabeerwartungen berücksichtigen.