Ich habe eine Textdatei ( devel.xml
).
Ich habe das Wort REPLACETHIS hinzugefügt, um diese Zeichenfolge durch den Inhalt in einer anderen Datei zu ersetzen ( temp.txt
).
Das Nächste, was ich habe, ist folgendes:
sed -i -e "/REPLACETHIS/r temp.TXT" -e "s///" devel.txt;
Dadurch wird der Inhalt nach der Zeichenfolge eingefügt und die Zeichenfolge anschließend gelöscht.
Ist das der beste Weg, es zu tun?
text-processing
sed
perl
RafaelGP
quelle
quelle
Antworten:
Was Sie getan haben, ist zu entfernen,
SUBSTITUTETHIS
wo immer es in der Datei erscheint (aber nicht der Rest der Zeile, in der es erscheint) und den Inhalttemp.TXT
unterhalb dieser Zeile einzufügen . WennSUBSTITUTETHIS
mehrmals in einer Zeile angezeigt wird, wird nur das erste Vorkommen entfernt und nur eine Kopie vontemp.TXT
hinzugefügt.Wenn Sie die gesamte Zeile ersetzen möchten, wenn
SUBSTITUTETHIS
angezeigt wird, verwenden Sie dend
Befehl. Da Sie beide ausführen müssenr
undd
wenn es ein Match gibt, ordnen Sie sie einer geschweiften Gruppe zu.In einigen sed-Implementierungen können Sie Befehle durch Semikolons trennen und Trennzeichen in geschweiften Klammern weglassen. Sie benötigen jedoch weiterhin eine neue Zeile, um das Argument für den
r
Befehl zu beenden :Wenn Sie
SUBSTITUTETHIS
den Inhalt der Datei durch den Inhalt der Datei ersetzen möchten , aber das, was vor und nach der Datei in der Zeile steht, beibehalten möchten , ist dies komplizierter. Die einfachste Methode besteht darin, den Inhalt der Datei in den Befehl sed aufzunehmen. Beachten Sie, dass Sie den Inhalt korrekt zitieren müssen.Oder verwenden Sie Perl. Dies ist kurz, wird jedoch
cat
für jede Ersetzung einmal ausgeführt:So lesen Sie die Datei einmal beim Start des Skripts und vermeiden, dass Sie von einem Shell-Befehl abhängig sind:
(Zur besseren Lesbarkeit auf zwei Zeilen dargestellt, Sie können jedoch den Zeilenumbruch weglassen.) Wenn der Dateiname variabel ist, übergeben Sie ihn über eine Umgebungsvariable an das Skript, um Anführungszeichen zu vermeiden:
quelle
cat temp.txt
ich das tun kanncat ${variable}
?-0777
Schalter zu verwenden , um die gesamte Datei zu schlürfen, und einen regulärenopen
:perl -0777 -pe 'BEGIN {open F, q(temp.TXT); $r=<F>; chomp($r)} s/SUBSTITUTETHIS/$r/ge' -i devel.txt
r temp.TXT
Nachrichten wie "BEGIN temp.TXT", "END temp.TXX"a
Sie den Befehl (Hinzufügen). grymoire.com/Unix/Sed.html#uh-36