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).
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).
Antworten:
echo 'task goes here' | cat - todo.txt > temp && mv temp todo.txt
oder
sed -i '1s/^/task goes here\n/' todo.txt
oder
sed -i '1itask goes here' todo.txt
|
) die Nachricht ( echo '...'
), für cat
die -
(Standardeingabe) als erste und todo.txt
als zweite Datei verwendet wird . cat
conCATenates mehrere Dateien. Senden Sie die Ausgabe ( >
) an eine Datei mit dem Namen temp
. Wenn es keine Fehler gibt ( &&
), cat
benennen Sie mv
die temp
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
Versuchen hexdump -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 versuchen cat -e
, Zeilenenden anzuzeigen.
1
bedeutet, dass der nächste Befehl nur in Zeile 1 der Datei ausgeführt wird und der i
Befehl Einfügen lautet. Schauen Sie in der Manpage unter "Adressen" und unter "Null- oder Einadressenbefehle" nach.
Eine meiner Meinung nach einfachere Option ist:
echo -e "task goes here\n$(cat todo.txt)" > todo.txt
Dies funktioniert, weil der Befehl innerhalb von $(...)
ausgeführt wird, bevor er todo.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 ...
echo "task goes here
$(cat todo.txt)" > todo.txt
... 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:
(echo 'task goes here' && cat todo.txt) > todo.txt
echo 'task goes here'$'\n'"$(cat todo.txt)" > todo.txt
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.
-e
Escape-Sequenzen nicht auch in die Datei todo.txt konvertiert?
Die moreutils
haben ein schönes Tool namens sponge
:
echo "task goes here" | cat - todo.txt | sponge todo.txt
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 über apt-get install moreutils
oder unter OS X mit Homebrew mit brew install moreutils
.
(echo 'ble'; cat todo.txt)
:-)
Sie können Vim im Ex-Modus verwenden:
ex -s -c '1i|task goes here' -c x todo.txt
1
erste Zeile auswählen
i
einfügen
x
speichern und schließen
Sie können eine neue temporäre Datei erstellen.
echo "new task" > new_todo.txt
cat todo.txt >> new_todo.txt
rm todo.txt
mv new_todo.txt todo.txt
Sie können auch sed
oder verwenden awk
. Aber im Grunde passiert das Gleiche.
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.
echo "$(echo 'task goes here' | cat - todo.txt)" > todo.txt
Es ist unmöglich, Zeilen an den Anfang der Datei zu setzen, ohne die gesamte Datei zu überschreiben.
Sie 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:
cat <(echo task go there) todo.txt > todo.txt.new && mv todo.txt.new todo.txt
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
:
echo 'task goes here' | cat - todo.txt | tee todo.txt
GitBash + Windows10 + Multline :
In dieser Version können Sie mehrzeilige Zeichenfolgen verwenden .
##############################################
## This section for demo purpose only, ##
## So you can save entire file as ##
## whatever.sh and run it. ##
## ##
##############################################
> MY_TARGET_FILE.txt ##Make Or Clear File
echo "[STARTER_CONTENT]" >> MY_TARGET_FILE.txt
##############################################
## Below is main code:
##################################################
TARGET_FILE_VARIABLE="MY_TARGET_FILE.txt"
ADD_TO_HEAD_VARIABLE=$(cat << "HEREDOC_HEAD_TEXT"
//| +-------------------------------------+ |//
//| | | |//
//| | MESSAGE_FOR_HEAD_OF_FILE | |//
//| | | |//
//| +-------------------------------------+ |//
HEREDOC_HEAD_TEXT
)
##################################################
TAR=$TARGET_FILE_VARIABLE ##
TEX=$ADD_TO_HEAD_VARIABLE ##
echo "$TEX" | cat - $TAR > TEMP && mv TEMP $TAR ##
##################################################
## Expected contents of MY_TARGET_FILE.txt :
## //| +-------------------------------------+ |//
## //| | | |//
## //| | MESSAGE_FOR_HEAD_OF_FILE | |//
## //| | | |//
## //| +-------------------------------------+ |//
## [STARTER_CONTENT]