Ich habe mich nach dem sed
Befehl 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?
text-processing
command-line
sed
Manolo
quelle
quelle
Antworten:
Verwenden Sie
sed
diei
Option insert ( ), mit der der Text in die vorhergehende Zeile eingefügt wird.Update des Frageautors:
Um die Datei an Ort und Stelle bearbeiten zu können - mit GNU
sed
- musste ich die-i
Option hinzufügen :Auch Syntax
Für Nicht-GNU-Sed
Sie müssen die Eingabetaste unmittelbar nach dem Backslash
1i\
und danach drückenfirst_line_text
:Beachten Sie auch, dass einige Nicht-GNU-
sed
Implementierungen (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 erzielensed
).quelle
-i
Option geht es nicht . Ich werde Ihre Antwort aktualisieren, bevor ich sie akzeptiere.sed '1 i\this text is entered above the existing first line' file
arbeite für mich.sed (GNU sed) 4.2.2
einfachsed '1 i text to insert' -i file
wie ein Zauber gewirkt. Dankawk
Antwort unten. Das sollte funktionieren.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.
quelle
Sie können Vim im Ex-Modus verwenden:
1
erste Zeile auswähleni
Text und Zeilenumbruch einfügenx
speichern und schließenquelle
Sie möchten Text vor der ersten Zeile einfügen , anstatt ihn danach anzufügen. Verwenden Sie daher
Ein Dokument hier kann auch helfen:
quelle
Mit GNU awk> = 4.1:
Im Gegensatz zu allen
sed
Antworten funktioniert dies auch bei leeren Dateien.quelle
inplace
ist eine Bibliothek, die leider auf allen awk-Distributionen enthalten ist. Ich erhalte die Meldung "awk: fatal: Quelldatei 'inplace' kann nicht zum LesenGNU Awk 4.2.1, API: 2.0 (GNU MPFR 4.0.1, GNU MP 6.1.2)
Wenn Sie die
-i
Option nicht angeben , wird kein Fehler angezeigt und die Ausgabe wird auf dem Standardterminal angezeigt, der Text wird jedoch nicht in die Datei eingefügt.quelle
-i
Schalter.gnu sed
spezifisch sind und es nur passiert, dassgnu sed
dasi
ohne einen Backslash akzeptiert wird ). Wenn andere denken, dass dies eine separate Antwort und eine positive Bewertung rechtfertigt ... na ja.Der
0a
Befehl, den Sie versucht haben , funktioniert inex
, der Vorgänger invi
:Der
printf
Befehl selbst gibt Folgendes aus:Das
0a
Mittel 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
x
bewirkt, dass Ex die Änderungen an der Datei speichert und beendet.quelle
Ich bin überrascht, dass in dieser alten Frage niemand den gebräuchlichsten (und in diesem Fall ganz einfachen) sed-Befehl gezeigt hat:
Was in den meisten Shells funktioniert und in mehreren sed Versionen portierbar ist.
Wenn GNU sed verfügbar ist, können Sie dies verwenden:
Der Unterschied besteht darin, dass GNU sed die Verwendung von a
\n
fü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:Welches funktioniert für sed Versionen.
quelle
Leider haben alle Antworten oben (meistens mit
sed
) für mich nicht geklappt, da sie alle die erste Zeile ersetzt haben. Ich bin auf einerUbuntu 16.04 LTS
Maschine. Hier ist meine Problemumgehung mitGNU Awk 4.0.2
:quelle
sed
Antwort, die Ersetzung verwendet, aber die vorhandene Zeile nicht ersetzt.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.
Erläuterung
Diese
cal
Ausgabe wird mit erweiterten RegEx ( ) und 6 angewendeten "Skripten" ( ) und aus Gründen der Lesbarkeit mit Escapezeichen versehenen Zeilenumbrüchen an gnu-sed
(gsed
auf 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
quelle
1i
vor 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.