2011-02-17 03:21:12 +0000 2011-02-17 03:21:12 +0000
306
306

Wie füge ich in Bash Text an den Anfang einer Datei an?

Hallo Ich möchte einer Datei Text voranstellen. Ich möchte z.B. am Anfang einer todo.txt-Datei Aufgaben hinzufügen. Mir ist echo 'task goes here' >> todo.txt bekannt, aber das fügt die Zeile am Ende der Datei hinzu (nicht das, was ich will).

Antworten (9)

396
396
396
2011-02-17 03:34:10 +0000
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
81
81
81
2012-12-19 18:57:40 +0000

Eine einfachere Option ist meiner Meinung nach :

echo -e "task goes here\n$(cat todo.txt)" > todo.txt

Dies funktioniert, weil der Befehl innerhalb von $(...) ausgeführt wird, bevor todo.txt mit > todo.txt

überschrieben wird. Während die anderen Antworten gut funktionieren, finde ich dies viel leichter zu merken, weil ich echo und cat jeden Tag benutze.

EDIT: Diese Lösung ist eine sehr schlechte Idee, wenn es irgendwelche Backslashes in todo.txt gibt, denn dank der Flagge -e wird echo sie interpretieren. Eine andere, sehr viel einfachere Möglichkeit, Zeilenumbrüche in die Vorwortzeichenfolge zu bekommen, ist…

echo "task goes here
$(cat todo.txt)" > todo.txt

…einfach Zeilenumbrüche zu verwenden. Sicher, es ist kein Einzeiler mehr, aber realistischerweise war es vorher auch kein Einzeiler. Wenn Sie dies innerhalb eines Skripts tun und Bedenken wegen des Einrückens haben (z.B. wenn Sie dies innerhalb einer Funktion ausführen), gibt es ein paar Umgehungsmöglichkeiten, damit dies immer noch gut passt, 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

Auch wenn Sie sich darum kümmern, ob ein Zeilenumbruch am Ende von todo.txt hinzugefügt wird, verwenden Sie diese nicht. Nun, außer dem vorletzten. Das bringt das Ende nicht durcheinander.

28
28
28
2013-04-22 12:47:19 +0000

Die moreutils haben ein nettes Tool namens sponge:

echo "task goes here" | cat - todo.txt | sponge todo.txt

Es “saugt” STDIN auf und schreibt dann in die Datei, was bedeutet, daß Sie sich nicht um temporäre Dateien und deren Verschieben kümmern müssen.

Sie können moreutils mit vielen Linux-Distributionen erhalten, durch apt-get install moreutils, oder unter OS X mit Homebrew , mit brew install moreutils.

12
12
12
2016-04-11 00:23:56 +0000

Sie können Vim im Ex-Modus benutzen:

ex -s -c '1i|task goes here' -c x todo.txt
  1. 1 erste Zeile wählen

  2. i einfügen

  3. x speichern und schließen

5
5
5
2011-02-17 03:26:24 +0000

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 awk verwenden. Aber im Grunde geschieht dasselbe.

3
3
3
2011-02-17 06:25:01 +0000

Sie können keinen Inhalt am Anfang einer Datei einfügen. Das Einzige, was Sie tun können, ist, entweder den vorhandenen Inhalt zu ersetzen oder Bytes nach dem aktuellen Dateiende anzuhängen.

Jede Lösung Ihrer Frage erfordert dann die Erstellung einer temporären Datei (oder eines Puffers) (im Speicher oder auf der Festplatte), die schließlich die Originaldatei überschreibt.

Achten Sie darauf, keine Daten zu verlieren, indem Sie die Originaldatei bei der Erstellung der neuen Datei beibehalten, falls das Dateisystem während des Prozesses einmal voll sein sollte. z.B.:

cat <(echo task go there) todo.txt > todo.txt.new && mv todo.txt.new todo.txt
3
3
3
2013-01-09 22:49:33 +0000

Wenn die Textdatei klein genug ist, um in den Speicher zu passen, müssen Sie keine temporäre Datei erstellen, mit der sie ersetzt werden kann. Sie können alles in den Speicher laden und wieder in die Datei zurückschreiben.

echo "$(echo 'task goes here' | cat - todo.txt)" > todo.txt

Es ist unmöglich, am Anfang der Datei Zeilen hinzuzufügen, ohne die gesamte Datei zu überschreiben.

1
1
1
2014-07-08 14:16:36 +0000

Sie können tee:

echo 'task goes here' | cat - todo.txt | tee todo.txt
``` verwenden
0
0
0
2018-08-04 07:04:48 +0000

GitBash + Windows10 + Multline :

Hier ist eine Version, mit der Sie mehrzeilige Zeichenfolgen verwenden können.

##############################################
## 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]