Ich verwende egrep -R
gefolgt von einem regulären Ausdruck, der ungefähr 10 Gewerkschaften enthält, also wie:
.jpg | .png | .gif
usw. Dies funktioniert gut, jetzt möchte ich alle gefundenen Zeichenfolgen durch ersetzen.bmp
Ich dachte an so etwas
egrep -lR "\.jpg|\.png|\.gif" . | sed "s/some_expression/.jpg/" file_it_came_form
Das Problem hier ist also, wie ich einen ähnlichen regulären Union-Ausdruck in sed
mache und wie ich ihm sage, dass er die Änderungen an der Datei speichern soll, von der er die Eingabe erhalten hat.
Antworten:
Verwenden Sie diesen Befehl:
egrep
: Finden Sie passende Zeilen mit erweiterten regulären Ausdrücken-l
: Nur übereinstimmende Dateinamen auflisten-R
: Durchsuchen Sie rekursiv alle angegebenen Verzeichnisse-Z
:\0
als Datensatztrennzeichen verwenden"\.jpg|\.png|\.gif"
: mit einer der Zeichenfolgen übereinstimmen".jpg"
,".gif"
oder".png"
.
: Starten Sie die Suche im aktuellen Verzeichnisxargs
: Führen Sie einen Befehl mit dem Argument stdin aus-0
:\0
als Datensatztrennzeichen verwenden. Dies ist wichtig , die passen-Z
vonegrep
und durch Leerzeichen und Zeilenumbrüche in Eingabedateinamen werden getäuscht zu vermeiden.-l
: Verwenden Sie eine Zeile pro Befehl als Parametersed
: the s tream ed itor-i
: Ersetzen Sie die Eingabedatei durch die Ausgabe, ohne eine Sicherungskopie zu erstellen-e
: Verwenden Sie das folgende Argument als Ausdruck's/\.jpg\|\.gif\|\.png/.bmp/g'
: Alle Vorkommen der Saiten ersetzen".jpg"
,".gif"
oder".png"
mit".bmp"
quelle
sed -r
für erweiterte reguläre Ausdrücke verwenden. Zu diesem Zeitpunkt stimmt das Muster mit dem überein, was in egrep verwendet wird, und Sie können es zur Wiederverwendung in eine Variable einfügen.Ehrlich gesagt, so sehr ich Sed für geeignete Aufgaben liebe, ist dies definitiv eine Aufgabe für Perl - es ist wirklich mächtiger für diese Art von Einzeiler, insbesondere, "es dorthin zurückzuschreiben, wo es herkommt" (Perls
-i
Schalter erledigt es dafür Sie und optional können Sie auch die alte Version beibehalten, z. B. mit einem angehängten .bak, verwenden Sie-i.bak
stattdessen einfach ).anstatt komplizierte Arbeit in sed (wenn überhaupt möglich) oder awk ...
quelle
sed
. Ich glaube, ich habe entweder einige Flags für sed vergessen oder es hatte Einschränkungen.Ein anderer Weg, dies zu tun
Hilfe zum obigen Befehl
Die Suche führt die Suche für Sie in dem aktuellen Verzeichnis durch, das durch angegeben ist
.
-name
Der Name der Datei in meinem Fall, seine pom.xml, kann Platzhalter geben.-exec
ausführensed
Stream-Editor-i
Fall ignorierens
ist für Ersatz/4.6.0.../
Zu durchsuchende Zeichenfolge/5.0.0.../
Zu ersetzende Zeichenfolgequelle
Ich konnte keinen der Befehle auf dieser Seite für mich verwenden: Die sed-Lösung fügte am Ende aller verarbeiteten Dateien eine neue Zeile hinzu, und die perl-Lösung konnte nicht genügend Argumente von find akzeptieren. Ich habe diese Lösung gefunden, die perfekt funktioniert:
Dadurch wird den aktuellen Verzeichnisbaum und ersetzt rekursiv
search_regex
mitreplacement_string
in beliebigen Dateien mit der Endung.h
oder.m
.Ich habe in der Vergangenheit auch rpl für diesen Zweck verwendet.
quelle
Versuchen Sie etwas mit einer for-Schleife
nicht schön, sollte aber tun.
quelle
|while read i
Musters würde Streaming ermöglichen und Längenbeschränkungen vermeiden, wenn die Ergebnisse von egrep zu lang werdenMein Anwendungsfall war ich ersetzen wollte
foo:/Drive_Letter
mitfoo:/bar/baz/xyz
konnte ich tun , um es mit dem folgenden Code in meinem Fall. Ich befand mich in demselben Verzeichnis, in dem sich die meisten Dateien befanden.hoffe das hat geholfen.
UPDATE s | foo: / Drive_letter: | foo: / ba / baz / xyz | g
quelle
sed 's|foo:/Drive_letter:|foo:/ba/baz/xyz|g'