2012-05-23 2 views

Antwort

10

in 2 Schritten:

content=$(cat file.txt) # no cat abuse this time 
echo -en "foobar\n$content" >file.txt 
+1

Kann das 'cat' noch vermeiden: ' content = "$ (

+0

@MarkReed hat einen interessanten Vorschlag, der in der Bash funktioniert, aber nicht in dash. Ich glaube, dies ist ein weiteres Beispiel für das Bash-Verhalten, das nicht der Sprachspezifikation entspricht, da '

+0

Beachten Sie, dass das Festlegen von Inhalt auf diese Weise alle nachfolgenden Leerzeichen aus der Datei einschließlich des letzten Zeilenumbrüches verwirft. –

6

Das ist Nicht-Standard, aber wenn Ihr sed unterstützt -i können Sie tun:

sed -i '1i\ 
Foobar' file.txt 
+0

Ich glaube nicht, dass das notwendig ist. '1i Foobar' sollte funktionieren. – dogbane

+0

@dogbane Auslassen der maskierten Zeilenumbruch funktioniert in einigen sed, aber nicht alle. Viele sed werden ersticken, wenn es weggelassen wird. –

3

ich es einfach halten würde. Die einfachste und wahrscheinlich schnellste Lösung ist einfach:

(echo "Foobar"; cat file.txt) >tmpfile 
cp tmpfile file.txt 
rm tmpfile 

Wenn es den „cp“ durch „mv“ nicht, dass datei.txt Inode Änderungen Rolle, ersetzen. Eine Lösung, die wesentlich schneller ist, ist nicht möglich, da die Semantik des Unix-Dateisystems das Anhängen an eine Datei nicht unterstützt.

+1

Anstatt cp und entfernen, warum nicht einfach 'mv tmpfile.txt file.txt'? –

+0

'Wenn es nicht wichtig ist, dass 'file.txt' inode ändert, ersetzen Sie die" cp "durch" mv "' –

+1

Wie oft kümmern Sie sich wirklich um die Inode-Änderung? –

Verwandte Themen