Ich möchte Text an eine Datei anhängen echo "abc" >>file.txt
.
Dies füge aber abc
nach einer neuen Zeile hinzu
Wie kann ich abc
am Ende der Datei mit Echo ohne neue Zeile hinzufügen ?
shell
text-processing
io-redirection
echo
choijj
quelle
quelle
abc
ohne eine letzte neue Zeile hinzufügt, was (nachdem man Ihre Frage aufmerksam gelesen hat) nicht so zu sein scheint, wie Sie es wollen.Antworten:
echo "abc" >>file.txt
Setzt einen Zeilenumbruch nachabc
, nicht vorher. Wenn Sie am Endeabc
eine eigene Zeile haben, bedeutet dies, dass die vorherige Zeileabc
bereits in vorhanden warfile.txt
.Beachten Sie, dass es völlig normal ist, dass eine Textdatei in einer neuen Zeile endet. Unter Unix besteht eine Zeile aus einer Folge von anderen Zeichen als null⁰ oder newline, gefolgt von einer newline. 1 Daher endet jede nicht leere Textdatei mit einem Zeilenumbruch.
Wenn Sie der letzten Zeile einer Datei Text hinzufügen möchten, können Sie dies nicht tun
>>
, da dieser immer an die Datei angehängt wird und daher immer nach der letzten neuen Zeile geschrieben wird. Stattdessen benötigen Sie ein Tool, mit dem Sie eine vorhandene Datei ändern können. Beispielsweise können Sie sed verwenden :Im sed-Befehl
$
bedeutet das erste "s/REGEX/REPLACEMENT/
Führe den folgenden Befehl nur in der letzten Zeile aus", der Befehl ersetzt REGEX durch REPLACEMENT und der reguläre Ausdruck$
stimmt am Ende der Zeile überein.Der sed-Befehl von Linux verfügt über eine integrierte Funktion zum Automatisieren dieser Sequenz zum Erstellen neuer Dateien und zum Ersetzen. Sie können diese Sequenz also auf verkürzen
⁰ Das ist ein Null-Byte, das von ASCII als NUL und von Unicode als U + 0000 bezeichnet wird. Textverarbeitungsprogramme können mit diesem Zeichen zurechtkommen oder nicht.
1 Siehe die Definitionen von Textdatei , Linie und Newline - Zeichen im Abschnitt „Definitionen“ der Basis Definitionen Kapitel IEEE 1.003,1-2.008: 2016.
quelle
0x41
(ASCII'A'
) anhänge , handelt es sich technisch gesehen nicht mehr um eine Textdatei? Wenn ja, würde ich vorschlagen, diesen Punkt zu betonen, da es eine Art unintuitive Definition ist. Andernfalls kann eine geringfügige Änderung der Formulierung helfen, die Verwirrung zu vermeiden.Ich denke nicht, dass es mit dem
echo
Befehl möglich ist, sondern mit dem folgendensed
Ansatz:-i
- Ändern Sie die Datei an Ort und Stelle$
- Geben Sie den letzten Datensatz / die letzte Zeile ans/$/abc/
- Ersetze das Ende der Zeile$
durch einen Teilstringabc
(für den letzten Datensatz)quelle
date >file; ls -i file; sed -i 's/201/ZZZ/' file; ls -i file
Angenommen, die Datei endet noch nicht in einer neuen Zeile und Sie möchten einfach etwas mehr Text anhängen, ohne einen hinzuzufügen, können Sie das
-n
Argument verwenden, zEinige UNIX-Systeme bieten diese Option jedoch nicht an. Wenn dies der Fall ist, können Sie
printf
z(Das erste
%s
Argument ist, sich vor dem zusätzlichen Text mit%
Formatierungszeichen zu schützen. )Von
man echo
(auf macOS High Sierra):quelle
echo -n
würde am Ende keinen Zeilenumbruch setzenabc
, aberabc
immer noch einen Zeilenumbruch vorausgehen, was der Benutzer vermeiden möchte.\n
gar nicht erst auftauchten. Mehr Optionen sind besser, insbesondere wenn nicht bei jeder Änderung die gesamte Datei neu geschrieben werden muss (was ziemlich langsam werden und in polynomieller Zeit ablaufen kann, wenn es wiederholt ausgeführt wird).Wenn Sie den
truncate
Befehl haben und Ihre Textdatei NL als letztes Zeichen enthält, können Sie ihn entfernen und Ihren Text folgendermaßen anhängen:(Beachten Sie, dass
truncate
der Dateiinhalt keine Rolle spielt. In diesem Beispiel wird die Dateigröße lediglich um ein Byte reduziert. Wenn Ihr letztes Zeichen kein einzelnes Byte ist, dh ein "breites" Mehrbyte-Zeichen, führen Sie eine Beschädigung ein.)quelle
Was Sie wollen, ist, es am Ende der letzten Zeile, also kurz vor dem Begrenzer dieser letzten Zeile, also kurz vor dem letzten Zeichen der Datei, einzufügen.
Mit
ksh93
können Sie:Wo
1<>
ist der Standardoperator zum Öffnen einer Datei im Lese- und Schreibmodus (und vor allem ohne Kürzung ) auf stdout und>#((...))
ist ein ksh93-spezifischer Suchoperator (hier zum Suchen vor dem letzten Byte). Beachten Sie, dassecho
schreibt,abc<newline>
wo dasa
die neue Zeile überschreibt, die dort war, undecho
seine eigene neue Zeile hinzufügt.Das
zsh
Äquivalent:Um ein genaueres Äquivalent zu erhalten, müssen Sie auch eine Fehlermeldung ausgeben, wenn die Suche fehlschlägt:
quelle
Wahrscheinlich ein UUOC, aber Sie könnten auch tun:
Gilles weist darauf hin, dass dieser Befehl begrenzt ist:
Seien Sie außerdem vorsichtig bei der Verwendung
cat
von Dateien, mit denen Sie nicht vertraut sind:Fazit :
Verwenden Sie sed
quelle
echo
: pcat
, sondern mit Problemen, bei denen beliebige Escape-Sequenzen an das Terminal gesendet werden.