Ich brauche einen SED- oder AWK-Befehl, um die letzte Zeile in einer Datei zu finden und </pre>
sie zu ergänzen.
Wie zum Beispiel:
LINELINELINE
Änderungen an:
LINELINELINE</pre>
Antwort1
Sie können auch eine so genanntezusammengesetzter Befehl.Dabei handelt es sich um eine Liste von Befehlen, die von der Shell für alle Zwecke außerhalb des zusammengesetzten Befehls als ein einziger Befehl behandelt werden.
Ja, das ist eine etwas rekursive Definition; ein Beispiel macht es leichter verständlich.
Um beispielsweise eine Datei mit <pre>
und zu umgeben </pre>
, können Sie einen Befehl wie den folgenden verwenden:
( printf '<pre>' ; cat originalfile ; printf '</pre>' ) > newfile
Wenn Sie keine temporäre Datei haben, sondern die Ausgabe eines Befehls mit etwas anderem umgeben möchten, können Sie diesen Befehl anstelle von Folgendem einfügen cat
:
( printf '<pre>' ; find / -type d -print ; printf '</pre>' ) > somefile
Dies alles funktioniert, indem die Umleitung auf die Ausgabe des gesamten zusammengesetzten Befehls angewendet wird, anstatt nur auf seine Teile.
Natürlich wird hier nicht sed
oder awk
wie gewünscht verwendet, aber für diese Art von Aufgabe ist der Einsatz dieser Tools völlig übertrieben.
Antwort2
Wie wäre es damit:
echo "</pre>" >> /path/to/the/file
Oder es ist am Anfang etwas kniffliger, da müsste man für die Ausgabe eine andere Datei verwenden.
echo "<pre>" | cat - /path/to/the/file > /path/to/the/newfile
cat
bedeutet Verketten und hat in diesem Fall zwei Argumente: Das -
bedeutet Standardeingabe, sodass der erste Teil der verketteten Datei das ist, was dorthin weitergeleitet wird (in diesem Fall das echo
). Das zweite Argument ist die Datei, der Sie voranstellen möchten. Die verketteten Dateien werden dann an ausgegeben newfile
.
Antwort3
Mit (GNU) sed
(gemäß Tag in der Frage):
$ sed -i -e '$a\</pre>' file.in
Dieser Willehinzufügeneine Zeile mit </pre>
darauf zu file.in
.
Alternative:
$ sed -i -e '$s@\(.*\)@\1</pre>@' file.in
Dies wird </pre>
der letzten Zeile in hinzugefügt file.in
.