Wie hänge ich Text an eine Datei an?

109

Was ist der einfachste Weg, um Text unter Linux an eine Datei anzuhängen?

Ich habe mir diese Frage angesehen , aber die akzeptierte Antwort verwendet ein zusätzliches Programm ( sed). Ich bin sicher, es sollte einen einfacheren Weg mit echooder ähnlichem geben.

Dchris
quelle

Antworten:

125
cat >> filename
This is text, perhaps pasted in from some other source.
Or else entered at the keyboard, doesn't matter. 
^D

Im Wesentlichen können Sie beliebigen Text in die Datei kopieren. STRG-D sendet ein Dateiende-Signal, das die Eingabe beendet und Sie zur Shell zurückbringt.

Jon Kiparsky
quelle
2
Wie kann ich das tun, wenn die Datei Root-Berechtigung benötigt?
UselesssCat
2
@UselesssCat Wenn etwas "Berechtigung verweigert" lautet, überprüfe ich den von mir ausgeführten Befehl erneut und verwende ihn dann sudo !!- wodurch der letzte Befehl mit sudovorangestelltem Befehl ausgeführt wird . Ich habe kürzlich herausgefunden, dass dies auch mit nanoetc funktioniert (indem ich versehentlich versucht habe nano nano auth...)
Sandra
Wenn Sie sudo verwenden oder dies in einem Skript verwenden müssen, lesen Sie meine Folgemaßnahmen zu dieser akzeptierten Antwort weiter unten.
user12345
4
Ich wusste nicht, dass Katze so benutzt werden kann! Als würde man einen Tagebucheintrag schreiben. Ich wusste auch nicht, was Strg-D macht. Danke dir!
Houallet
1
@ Sandra - Vorher nicht benutzt !!, super. So oft mache ich Sachen wie cat /var/log/apache/error.logund bekomme die Erlaubnis verweigert. Dies kann auch mit einer ID aus dem Verlauf erfolgen, z. B. sudo !1419wird der Befehl in der Zeile 1419im Verlauf als sudo ausgeführt.
Cyclonecode
172

Wie wäre es mit:

echo "hello" >> <filename>

Wenn Sie den >>Operator verwenden, werden Daten am Ende der Datei angehängt, während bei Verwendung des Operators >der Inhalt der Datei überschrieben wird, falls dieser bereits vorhanden ist.

Sie können auch printfauf die gleiche Weise verwenden:

printf "hello" >> <filename>

Beachten Sie, dass die Verwendung der oben genannten Methoden gefährlich sein kann. Wenn Sie beispielsweise bereits eine Datei haben und Daten an das Ende der Datei anhängen müssen und vergessen, die letzten hinzuzufügen, werden >alle Daten in der Datei zerstört. Sie können dieses Verhalten ändern, indem Sie die noclobberVariable in Ihrem .bashrc:

set -o noclobber

Wenn Sie dies versuchen, erhalten echo "hello" > file.txtSie eine Warnung cannot overwrite existing file.

Um das Schreiben in die Datei zu erzwingen, müssen Sie jetzt die spezielle Syntax verwenden:

echo "hello" >| <filename>

Sie sollten auch wissen, dass standardmäßig echoein nachfolgendes Zeilenumbruchzeichen hinzugefügt wird, das mithilfe des -nFlags unterdrückt werden kann :

echo -n "hello" >> <filename>

Verweise

Cyclonecode
quelle
4
Im Allgemeinen gefällt mir dies mehr als die akzeptierte Antwort, die verwendet wird cat, aber Sie sollten besser vorsichtig sein, wenn Sie >>stattdessen verwenden >!
Sixty4bit
@ sechzig4bit - stimme voll und ganz zu, aber ich denke, du musst immer wissen, was du tust, wenn du mit einer Shell sudo rm -r /
arbeitest,
1
besser sudo rm -r /als sudo rm -rf /! ^ _ ^ Gibt es ein Flag, das um Bestätigung bittet, bevor der Inhalt einer vorhandenen Datei mit überschrieben wird >? Es scheint eine gute Idee zu sein, immer eine solche Flagge zu verwenden.
Sixty4bit
2
@ sixty4bit - Sie können hinzufügen , set -o noclobberin der .bashrcdann können Sie die spezielle Syntax ohne eine bestehende Datei nicht überschreibenecho "hello" >| <filename>
Cyclonecode
Können Sie ein Beispiel geben, in dem die Datei aufgerufen wird, sagen Sie "myFile.txt" oder so? Ich bin nicht sicher, ob es in Ihrem Beispiel <Dateiname> oder Dateiname ist
Bharal
24

Ein anderer möglicher Weg ist:

echo "text" | tee -a filename >/dev/null

Das -awird am Ende der Datei angehängt.

Verwenden Sie bei sudoBedarf:

echo "text" | sudo tee -a filename >/dev/null
user9869932
quelle
Warum das> / dev / null am Ende?
Quadrivium
1
Das >/dev/null am Ende verhindert, dass "Text" in Ihrer Konsole angezeigt wird.
user9869932
13

Folgen Sie der akzeptierten Antwort.

Sie benötigen etwas anderes als STRG-D, um das Ende zu bestimmen, wenn Sie dies in einem Skript verwenden . Versuchen Sie stattdessen Folgendes:

cat << EOF >> filename
This is text entered via the keyboard or via a script.
EOF

Dadurch wird Text an die angegebene Datei angehängt (ohne "EOF").

Es wird ein Here-Dokument (oder Heredoc) verwendet .

Wenn Sie jedoch sudo benötigen, um an die angegebene Datei anzuhängen, treten aufgrund der E / A-Umleitung Probleme bei der Verwendung eines Heredocs auf, wenn Sie direkt in die Befehlszeile eingeben.

Diese Variante funktioniert, wenn Sie direkt in die Befehlszeile eingeben:

sudo sh -c 'cat << EOF >> filename
This is text entered via the keyboard.
EOF'

Oder Sie können teestattdessen verwenden, um das Kommandozeilen-Sudo-Problem zu vermeiden, das bei der Verwendung des Heredoc mit cat auftritt:

tee -a filename << EOF
This is text entered via the keyboard or via a script.
EOF
user12345
quelle
Ich benutze cat << 'EOF' >seit Jahren und wusste nicht, was ich cat << 'EOF' >>anhängen sollte! Danke
FreeSoftwareServers