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 Inhalt temp.TXT
unterhalb dieser Zeile einzufügen . Wenn SUBSTITUTETHIS
mehrmals in einer Zeile angezeigt wird, wird nur das erste Vorkommen entfernt und nur eine Kopie von temp.TXT
hinzugefügt.
Wenn Sie die gesamte Zeile ersetzen möchten, wenn SUBSTITUTETHIS
angezeigt wird, verwenden Sie den d
Befehl. Da Sie beide ausführen müssen r
und d
wenn es ein Match gibt, ordnen Sie sie einer geschweiften Gruppe zu.
sed -e '/SUBSTITUTETHIS/ {' -e 'r temp.TXT' -e 'd' -e '}' -i devel.txt
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 :
sed -e '/SUBSTITUTETHIS/ {r temp.TXT
d}' -i devel.txt
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.
sed -e "s/SUBSTITUTETHIS/$(<temp.TXT sed -e 's/[\&/]/\\&/g' -e 's/$/\\n/' | tr -d '\n')/g" -i devel.txt
Oder verwenden Sie Perl. Dies ist kurz, wird jedoch cat
für jede Ersetzung einmal ausgeführt:
perl -pe 's/SUBSTITUTETHIS/`cat temp.TXT`/ge' -i devel.txt
So lesen Sie die Datei einmal beim Start des Skripts und vermeiden, dass Sie von einem Shell-Befehl abhängig sind:
perl -MFile::Slurp -pe 'BEGIN {$r = read_file("temp.TXT"); chomp($r)}
s/SUBSTITUTETHIS/$r/ge' -i devel.txt
(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:
replacement_file=temp.TXT perl -MFile::Slurp -pe 'BEGIN {$r = read_file($replacement_file); chomp($r)}
s/SUBSTITUTETHIS/$r/ge' -i devel.txt