Wie füge ich Text vor der ersten Zeile einer Datei ein?

76

Ich habe mich nach dem sedBefehl umgesehen, einer Datei in einer bestimmten Zeile Text hinzuzufügen. So fügen Sie Text nach Zeile 1 ein:

sed '1 a\

Aber ich möchte es vor Zeile 1 hinzufügen . Es wäre:

sed '0 a\

aber ich bekomme diese Fehlermeldung: invalid usage of line address 0.

Irgendein Vorschlag?

Manolo
quelle
stackoverflow.com/questions/15157659/…
Léo Léopold Hertz 준영

Antworten:

101

Verwenden Sie seddie iOption insert ( ), mit der der Text in die vorhergehende Zeile eingefügt wird.

sed '1 i\

Update des Frageautors:

Um die Datei an Ort und Stelle bearbeiten zu können - mit GNU sed- musste ich die -iOption hinzufügen :

sed -i '1 i\anything' file

Auch Syntax

sed  -i '1i text' filename

Für Nicht-GNU-Sed

Sie müssen die Eingabetaste unmittelbar nach dem Backslash 1i\und danach drücken first_line_text:

sed -i '1i\
first_line_text
'

Beachten Sie auch, dass einige Nicht-GNU- sedImplementierungen (zum Beispiel die unter macOS) ein Argument für das Flag erfordern-i (verwenden Sie -i ''diese Option, um den gleichen Effekt wie bei GNU zu erzielen sed).

Verdächtiger
quelle
1
Ohne -iOption geht es nicht . Ich werde Ihre Antwort aktualisieren, bevor ich sie akzeptiere.
Manolo
1
Vielen Dank. Welches Betriebssystem verwenden Sie? Die ursprüngliche Lösung funktionierte auf OpenSuse 9.
suspectus
1
Interessant! Ich bin auf Lubuntu 13.10 und sed '1 i\this text is entered above the existing first line' filearbeite für mich.
2
Hier hat die Verwendung sed (GNU sed) 4.2.2einfach sed '1 i text to insert' -i filewie ein Zauber gewirkt. Dank
Tonne
1
@FeRD Siehe meine schlecht eingestufte awkAntwort unten. Das sollte funktionieren.
Rudimeier
18

Echo wird verwendet, um den Text zu erhalten. Katzendateiname - druckt die Datei in der Konsole und> sendet sie an eine andere Datei Dateiname1. Anschließend verschieben wir Dateiname1 in Dateiname, um den Text in die erste Zeile der gewünschten Datei einzufügen.

  (echo "some text" && cat filename) > filename1 && mv filename1 filename
Ankit Shah
quelle
7
Bitte lassen Sie mich wissen, warum Folgendes abgelehnt wird
Ankit Shah
1
Vielleicht, weil das OP sed erwähnt. Das verdient meiner Meinung nach keine Gegenstimme. Diese Lösung passte sogar am besten zu meinen Bedürfnissen und wurde dann positiv bewertet.
рüффп
Ich habe gestimmt. arbeitet an ksh für mich.
Arcee123
16

Sie können Vim im Ex-Modus verwenden:

ex -sc '1i|ALFA BRAVO' -cx file
  1. 1 erste Zeile auswählen

  2. i Text und Zeilenumbruch einfügen

  3. x speichern und schließen

Steven Penny
quelle
7

Sie möchten Text vor der ersten Zeile einfügen , anstatt ihn danach anzufügen. Verwenden Sie daher

sed '1 i\
your_text' your_file

Ein Dokument hier kann auch helfen:

cat /dev/stdin your_file <<EOI
Your text
goes here
EOI
Joseph R.
quelle
6

Mit GNU awk> = 4.1:

awk -i inplace 'BEGINFILE{print "first line"}{print}' foo.sh

Im Gegensatz zu allen sedAntworten funktioniert dies auch bei leeren Dateien.

rudimeier
quelle
inplaceist eine Bibliothek, die leider auf allen awk-Distributionen enthalten ist. Ich erhalte die Meldung "awk: fatal: Quelldatei 'inplace' kann nicht zum Lesen GNU Awk 4.2.1, API: 2.0 (GNU MPFR 4.0.1, GNU MP 6.1.2)
geöffnet werden
6
sed  -i '1i new_text' file_name

Wenn Sie die -iOption nicht angeben , wird kein Fehler angezeigt und die Ausgabe wird auf dem Standardterminal angezeigt, der Text wird jedoch nicht in die Datei eingefügt.

devi.
quelle
Die Frage ist nicht über den -iSchalter.
don_crissti
Wie findest du das? Es ist eine Antwort auf die Frage. Ja, es ist ähnlich wie die akzeptierte Antwort, aber nicht genau das gleiche.
G-Man
@ G-Man - man könnte behaupten, dass die von cas verwendete Vorlage alles andere als ideal ist, aber in Wirklichkeit ist dies ähnlich wie in nahezu identisch ... der Unterschied ist der Abstand und die Tatsache, dass diese Vorlage keinen Backslash hat. Soweit es mich betrifft, sind sie technisch identisch (da sie beide gnu sedspezifisch sind und es nur passiert, dass gnu seddas iohne einen Backslash akzeptiert wird ). Wenn andere denken, dass dies eine separate Antwort und eine positive Bewertung rechtfertigt ... na ja.
don_crissti
2

Der 0aBefehl, den Sie versucht haben , funktioniert in ex, der Vorgänger invi :

printf '%s\n' 0a 'Anything you want to add' . x | ex file.txt

Der printfBefehl selbst gibt Folgendes aus:

0a
Anything you want to add
.
x

Das 0aMittel wird nach der 0. Zeile (dh vor der ersten Zeile) angehängt.

Die nächste Zeile oder mehrere Zeilen sind wörtliche Texte, die hinzugefügt werden sollen.

Das .on a line selbst beendet den "append" -Befehl.

Das xbewirkt, dass Ex die Änderungen an der Datei speichert und beendet.

Platzhalter
quelle
1

Ich bin überrascht, dass in dieser alten Frage niemand den gebräuchlichsten (und in diesem Fall ganz einfachen) sed-Befehl gezeigt hat:

$ sed  -i '1s/^/new_text\
/' file_name

Was in den meisten Shells funktioniert und in mehreren sed Versionen portierbar ist.
Wenn GNU sed verfügbar ist, können Sie dies verwenden:

$ sed -i '1s/^/new_text\n' file_name

Der Unterschied besteht darin, dass GNU sed die Verwendung von a \nfür eine neue Zeile zulässt und andere eine wörtliche neue Zeile mit vorangestelltem Backslash benötigen (was auch in GNU sed sowieso funktioniert).

Wenn eine Shell verwendet wird, die die $'…'Syntax akzeptiert , können Sie die neue Zeile direkt einfügen, sodass sed sieht, dass die neue Zeile bereits vorhanden ist:

$ sed -i $'1s/^/new_text\\\n/' file_name

Welches funktioniert für sed Versionen.

Isaac
quelle
-1

Leider haben alle Antworten oben (meistens mit sed) für mich nicht geklappt, da sie alle die erste Zeile ersetzt haben. Ich bin auf einer Ubuntu 16.04 LTSMaschine. Hier ist meine Problemumgehung mit GNU Awk 4.0.2:

awk '{if(NR==1){$0="NEW_FIRST_LINE"$0; print $0} ;if(NR!=1){print $0}}' file_name
Splinter479
quelle
1
Nicht sicher, wovon Sie sprechen ... Es gibt nur eine sedAntwort, die Ersetzung verwendet, aber die vorhandene Zeile nicht ersetzt.
don_crissti
-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
Ich sage, dass Ihre Antwort zukünftigen Lesern dieser Frage keine neuen Optionen (Antworten) bietet . Wir haben bereits vier Antworten, bei denen Variationen von 1ivor der ersten Zeile eingefügt werden. Jemand mit dieser Frage müsste die Teile, die er benötigt, aus Ihrer Antwort extrahieren, um das Problem zu lösen. Da die Fragen kostenlos sind, lade ich Sie ein, Ihre eigenen Fragen zu stellen und zu beantworten, um Ihre spezifische Antwort zu geben.
Jeff Schaller