Ich schreibe ein Bash-Skript, um nach einer Datei zu suchen, wenn sie nicht existiert. Dann erstelle sie und hänge sie an:
Host localhost
ForwardAgent yes
So "line then new line 'tab' then text"
denke ich sein ein sensibles Format. Ich weiß, dass du das kannst:
cat temp.txt >> data.txt
Aber es scheint seltsam seit seinen zwei Zeilen. Gibt es eine Möglichkeit, das in diesem Format anzufügen:
echo "hello" >> greetings.txt
shell
text-processing
io-redirection
Die Legende
quelle
quelle
( echo "line 1" ; echo "line 2" ) >>greetings.txt
.{ echo "line 1" ; echo "line 2"; } >>greetings.txt
cat <<EOT
derEOT
ist nur eine zufällige Zeichenfolge. Könnte auch seincat <<FOO
.Oder, wenn es sich um eine wörtliche Registerkarte handelt, die Sie möchten (anstelle der vier Leerzeichen in Ihrer Frage):
Sie können den gleichen Effekt mit erzielen
echo
, aber genau wie variiert von Implementierung zu Implementierung, währendprintf
konstant ist.quelle
quelle
Ein anderer Ansatz ist zu verwenden
tee
Ein paar Auswahlzeilen aus
tee
der Manpage von:quelle
SED kann eine Zeile wie folgt an das Ende einer Datei anhängen:
sed -i '$ a text to be inserted' fileName.file
$
Wählt das Dateiende aus,a
fordert es zum Anhängen auf und danach folgt der einzufügende Text. Dann natürlich den Dateinamen.Quelle: http://www.yourownlinux.com/2015/04/sed-command-in-linux-append-and-insert-lines-to-file.html
========== EDIT == ==========
Hat dieser Ansatz einen zusätzlichen Nutzen als andere Lösungen?
Ja, dieser Ansatz hat den zusätzlichen Vorteil, dass bei einer Suche an alle zurückgegebenen Dateien Folgendes angehängt wird:
find . -name "*.html" -exec sed -i '$ a </html>' {} \;
Ich habe das obige Beispiel verwendet, um das End-HTML-Tag einzufügen, das auf jeder HTML-Seite in einer Reihe von Verzeichnissen fehlte.
==================================
quelle
sed
. BSDsed
bürgt mit dem Fehler:command a expects \ followed by text
. Verwenden Sie dies also nicht für eine Skriptlösung. es kann brechen. (Oder machen Sie es richtig, da die von BSD benötigte Syntax POSIX-kompatibel ist und auch unter GNU funktioniertsed
.find
wie folgt:find . -name "*.txt" -exec sh -c 'printf "%s\n\t%s\n" "Host localhost" "ForwardAgent yes" >> "$1"' sh {} ";"
.>
,>>
) ausführt und daher nicht unter Problemen wie dem Ausführen leidetsudo echo 'something' > /file
. Für mich ist es erlaubt perfekt eine Zeile in eine Datei in lxd Behälter so anhängen:lxc exec c sed -- '$ a newline' /myfile
.echo "a new line" >> foo.file
wird keine neue Zeile erstellt, wenn die Datei nicht das Ende einer neuen Zeile istsed -i '$ a a new line' foo.file
, diessed
ist jedoch der Fall. Dies ist besonders dann besser , wenn Sie der Datei immer eine neue Zeile hinzufügen möchten.Ich habe sed verwendet, weil es mit sudo verwendet werden kann. Zum Beispiel:
Die Alternative ist sehr hässlich wie:
und noch hässlicher, wenn man mit ssh fertig ist.
quelle
sed -i
Nehmen Sie nicht eine Erweiterung als Argument? Ihr Beispiel enthält möglicherweise falsche Parameter.Ein weiterer Liner ist:
Ich würde den
-e
Optionsgedanken bevorzugen , da er mehr Kontrolle gibt:quelle
Man kann
cat >> out.txt
entweder mit Perl oder Python emulieren , um den gleichen Effekt zu erzielen. Perl:Und Python:
Beachten Sie, dass Sie für Python Ctrl+ Dzweimal drücken müssen . Weitere Informationen finden Sie in der entsprechenden Frage zum Stackoverflow .
quelle
Hier ist ein Beispiel zum Anhängen mehrerer Zeilen in einer Datei:
quelle
Zusätzlich zur Hauptantwort, falls die Datei Superuser-Berechtigungen benötigt, funktioniert das Hinzufügen
sudo
vorecho
nicht.Dies liegt daran, dass die Shell die Befehle unterbricht und zwar
echo
als root ausgeführt, jedoch>>
mit normalen Berechtigungen ausgeführt wurde.Dies funktioniert für Superuser:
sudo su -c "echo 'Line 3' >> greetings.txt"
quelle
su
hier nicht (sudo su
ist nicht gut). Aber Sie haben Recht damit, dass Sie etwas brauchen, um die Shell-Umleitung zu verwalten. vielleichtsudo sh -c "echo stuff >> file.txt"
. Keine Nettoersparnis, aber eine bessere Praxis.