Hallo, ich möchte einer Datei Text voranstellen. Zum Beispiel möchte ich Aufgaben am Anfang einer todo.txt-Datei hinzufügen. Mir ist bewusst, echo 'task goes here' >> todo.txt
aber das fügt die Zeile an das Ende der Datei (nicht was ich will).
285
Antworten:
oder
oder
quelle
|
) die Nachricht (echo '...'
), fürcat
die-
(Standardeingabe) als erste undtodo.txt
als zweite Datei verwendet wird .cat
conCATenates mehrere Dateien. Senden Sie die Ausgabe (>
) an eine Datei mit dem Namentemp
. Wenn es keine Fehler gibt (&&
),cat
benennen Siemv
dietemp
Datei um ( ) und kehren Sie zur ursprünglichen Datei zurück (todo.txt
).cat
ein Backslash n empfangen wird, wird es nicht in eine neue Zeile konvertiert. Etwas anderes muss das getan haben.cat
Versuchenhexdump -C
Sie stattdessen , per Piping in zu prüfen, ob Sie tatsächlich Backslash und n senden oder ob es sich um eine neue Zeile handelt. Sie können auch versuchencat -e
, Zeilenenden anzuzeigen.1
bedeutet, dass der nächste Befehl nur in Zeile 1 der Datei ausgeführt wird und deri
Befehl Einfügen lautet. Schauen Sie in der Manpage unter "Adressen" und unter "Null- oder Einadressenbefehle" nach.Eine meiner Meinung nach einfachere Option ist:
Dies funktioniert, weil der Befehl innerhalb von
$(...)
ausgeführt wird, bevor ertodo.txt
mit überschrieben wird> todo.txt
Während die anderen Antworten gut funktionieren, fällt es mir viel leichter, mich daran zu erinnern, weil ich jeden Tag Echo und Katze benutze.
BEARBEITEN: Diese Lösung ist eine sehr schlechte Idee, wenn es irgendwelche Backslashes gibt
todo.txt
, weil sie dank des-e
Flag-Echos interpretiert werden. Eine andere, weitaus einfachere Möglichkeit, Zeilenumbrüche in die Vorwortzeichenfolge einzufügen, ist ...... einfach um Zeilenumbrüche zu benutzen. Sicher, es ist kein Einzeiler mehr, aber realistisch gesehen war es auch vorher kein Einzeiler. Wenn Sie dies innerhalb eines Skripts tun und sich Gedanken über das Einrücken machen (z. B. wenn Sie dies innerhalb einer Funktion ausführen), gibt es ein paar Problemumgehungen, um dies noch gut anzupassen, einschließlich, aber nicht beschränkt auf:
Wenn Sie sich darüber Gedanken machen, ob eine neue Zeile am Ende von hinzugefügt wird,
todo.txt
verwenden Sie diese nicht. Na ja, bis auf den vorletzten. Das bringt nichts mit dem Ende.quelle
-e
Escape-Sequenzen nicht auch in die Datei todo.txt konvertiert?Die
moreutils
haben ein schönes Tool namenssponge
:Es wird STDIN "aufsaugen" und dann in die Datei schreiben, was bedeutet, dass Sie sich keine Gedanken über temporäre Dateien machen und diese verschieben müssen.
Sie können
moreutils
mit vielen Linux-Distributionen überapt-get install moreutils
oder unter OS X mit Homebrew mitbrew install moreutils
.quelle
(echo 'ble'; cat todo.txt)
:-)Sie können Vim im Ex-Modus verwenden:
1
erste Zeile auswähleni
einfügenx
speichern und schließenquelle
Sie können eine neue temporäre Datei erstellen.
Sie können auch
sed
oder verwendenawk
. Aber im Grunde passiert das Gleiche.quelle
new_todo.txt
nur ein Teil davon geschrieben wird. Ihre Lösung scheint die Originaldatei zu verlieren.rm
der Originaldatei.Wenn die Textdatei klein genug ist, um in den Arbeitsspeicher zu passen, müssen Sie keine temporäre Datei erstellen, durch die sie ersetzt werden soll. Sie können alles in den Speicher laden und in die Datei zurückschreiben.
Es ist unmöglich, Zeilen an den Anfang der Datei zu setzen, ohne die gesamte Datei zu überschreiben.
quelle
text=$(cat file)
. AchtenSie können am Anfang einer Datei keinen Inhalt einfügen. Das einzige, was Sie tun können, ist entweder vorhandenen Inhalt zu ersetzen oder Bytes nach dem aktuellen Dateiende anzufügen.
Für jede Lösung Ihrer Frage muss dann eine temporäre Datei (oder ein Zwischenspeicher) erstellt werden (im Speicher oder auf der Festplatte), die letztendlich die ursprüngliche Datei überschreibt.
Achten Sie darauf, dass beim Erstellen der neuen Datei keine Daten verloren gehen, da die ursprüngliche Datei erhalten bleibt, falls das Dateisystem während des Vorgangs voll ist. z.B:
quelle
echo HOME=\"/g/Users/timregan/\" | cat - 'F:\Program Files\Git\etc\profile'
funktioniert,cat <echo HOME=\"/g/Users/timregan/\" 'F:\Program Files\Git\etc\profile'
gibt aber den Fehler "Echo: Keine solche Datei oder Verzeichnis"<
und(
würde die Syntax sprengen. Trycat <(echo HOME=\"/g/Users/timregan/\") 'F:\Program Files\Git\etc\profile'
Sie können verwenden
tee
:quelle
GitBash + Windows10 + Multline :
In dieser Version können Sie mehrzeilige Zeichenfolgen verwenden .
quelle