SED: Text nach der letzten Zeile einfügen?

76

Der Befehl fügt ein Tag an den Anfang einer Datei ein:

sed -i "1s/^/<?php /" file

Wie kann ich mit SED am Ende jeder Datei etwas einfügen?

don_crissti
quelle
3
{ cat file; echo 'END OF FILE'; } > newFile funktioniert das auch dank sh. *. (Nicht sed, aber funktioniert und einfach)
4
ein einfacher echo "Cool Text" >> filesollte auch den Trick machen.
Danpe

Antworten:

93

sed -e "\$aTEXTTOEND" ist der einfachste Weg.

Wie es funktioniert

$Entspricht der letzten Zeile (es ist eine normale sedAdresse; wird 4aTEXTTOENDnach der vierten Zeile aeingefügt ), ist der Befehl append und TEXTTOENDist das, was angehängt werden soll.

bseller
quelle
Escape $ as $$ in einem Makefile.
Stevesliva
Für OS X sed -e '$a\NEWLINE\\'. Ersetzen Sie NEWLINE durch eine aktuelle neue Zeile.
Jorge Bucaran
13
sed -i -e "\ $ aTEXTTOEND" <Dateiname> wäre der vollständige Befehl.
Lasse Meyer
2
funktioniert nicht auf macos Nicht einmal Jorge Bucaran Kommentar: sed: 1: "$ a \ NEWLINE \\": zusätzliche Zeichen nach \ am Ende eines Befehls
Emanuele Paolini
1
In Debian 9 wird eine neue Zeile hinzugefügt, anstatt am Ende der letzten Zeile.
Luciano Andress Martini
31

Keine Notwendigkeit, sedin diesem Fall zu verwenden. Wie wäre es mit

echo "<?php" >> file
innaM
quelle
2
Das stimmt, aber Sie können sich vorstellen, dass der Anwendungsfall des OP darin besteht, die Datei mit " <php " und " >" in Klammern zu setzen und ausgewählte Inhalte auf einmal zu zitieren, sodass er wahrscheinlich wirklich ein sedFragment haben möchte .
dmckee
2
Auch wenn Sie dies tun und keine neue Zeile möchten, verwenden Sie echo -n
Vinko Vrsalovic
2
Ich rate nicht gern. Jedes Mal, wenn ich es versuche, liege ich falsch.
4
Ein weiterer Grund, warum die akzeptierte Antwort nützlicher ist, ist das Voranstellen von sudo, was dazu führt, dass diese Variation fehlschlägt, da echoes sich eher um einen eingebauten Shell-Befehl als um eine ausführbare Datei handelt, die sich in$PATH
Tony Cesaro,
@ TonyCesaro: echoist eine eingebaute, aber auch eine ausführbare Datei in$PATH
Zan Lynx
24

Angenommen, Sie möchten den Dateien das End-PHP-Tag hinzufügen

sed -i '$s/$/\n?>/' file

sollte den Trick machen

Vinko Vrsalovic
quelle
1
Dies funktioniert gut in Fällen, in denen eine willkürliche Manipulation der letzten Eingabezeile gewünscht wird. Vielen Dank!
Jay Taylor
Eine zerlegte Erklärung des Befehls wäre sehr dankbar
GGhe
3

Verwenden Sie den Befehl sed 'append (a)'. Zum Beispiel, um zwei Zeilen am Ende der Datei anzuhängen:

sed -i -e '$a\
foo1 bar1\
foo2 bar2' file
user2802945
quelle
2

Auf einfache Weise können Sie die Änderungen des Inhalts in eine bestimmte Zeile in einer Datei schreiben und vornehmen. Wenn Sie an einer bestimmten Zeilennummer etwas einfügen möchten, können Sie den folgenden Befehl verwenden:

sed -i '2i i have started' sheikh.log

Wobei 2i- Zeile 2 und i für das Einfügen stehen. Wenn Sie in der letzten Zeile einfügen müssen, verwenden Sie $anstelle von 2. Ich habe begonnen - einzufügender Text und sheikh.logder Dateiname.

Wir können die Änderungen in der Zeile auch mit dem folgenden Befehl vornehmen

sed -i '2c we have started' sheikh.log

iwird geändert zu we.

Scheich Mohammed Abdulla
quelle
-1

Erstes und Letztes

Ich würde annehmen, dass jeder, der nach dem Einfügen / Anhängen von Text an den Anfang / das Ende einer Datei gesucht hat, wahrscheinlich auch wissen muss, wie man den anderen auch macht.

cal |                            \
  gsed -E                        \
       -e     '1i\{'             \
       -e     '1i\  "lines": ['  \
       -e 's/(.*)/    "\1",/'    \
       -e '$s/,$//'              \
       -e     '$a\  ]'           \
       -e     '$a\}'

Erläuterung

Diese calAusgabe wird mit erweiterten RegEx ( ) und 6 angewendeten "Skripten" ( ) und aus Gründen der Lesbarkeit mit Escapezeichen versehenen Zeilenumbrüchen an gnu- sed( gsedauf MacOS aufgerufen, das über brew.sh installiert wurde ) weitergeleitet . Die Skripte 1 und 2 werden verwendet, um "in Zeile 1 einzufügen". Die Skripte 5 und 6 werden verwendet, um "in Zeile <letzte> anzuhängen". Ich habe die Textausgaben vertikal ausgerichtet, damit der Code das wiedergibt, was im Ergebnis erwartet wird. Die Skripte 3 und 4 ersetzen (letzteres gilt nur für "line <last>"). Das Ergebnis ist die Konvertierung der Befehlsausgabe in ein gültiges JSON.-E-e\1i\$a\

Ausgabe

{
  "lines": [
    "    October 2019      ",
    "Su Mo Tu We Th Fr Sa  ",
    "       1  2  3  4  5  ",
    " 6  7  8  9 10 11 12  ",
    "13 14 15 16 17 18 19  ",
    "20 21 22 23 24 25 26  ",
    "27 28 29 30 31        ",
    "                      "
  ]
}
Bruno Bronosky
quelle
Obwohl ich nicht über Ihre Frage abgestimmt habe, haben wir bereits mehrere Antworten, einschließlich einer akzeptierten, die das gewünschte Ergebnis belegen.
Jeff Schaller
@ JeffSchaller Die Stack Exchange-Community ist kein Forum. Sein Zweck geht über die Unterstützung der Freigabe des OP hinaus. Ziel ist es, die globale Wissensbasis mit vielen Optionen auszustatten, auf die Suchende bei der Suche nach Antworten stoßen können. Der Grund für den Titel meiner Antwort ist, dass die Nutzer den Nutzen dieser Antwort erkennen, bevor sie überhaupt auf das Google-Ergebnis klicken.
Bruno Bronosky