Das kannst du nicht. Verwenden Sie entweder ed oder GNU sed oder perl oder tun Sie das, was Sie hinter den Kulissen tun: Erstellen Sie eine neue Datei für den Inhalt.
ed
, tragbar:
ed foo <<EOF
1,$s/^\([^,]*\),\([^,]*\),\([^,]*\).*/\1,\3/
w
q
EOF
GNU sed
:
sed -i -e 's/^\([^,]*\),\([^,]*\),\([^,]*\).*/\1,\3/' foo
Perl:
perl -i -l -F, -pae 'print @F[1,3]' foo
cut
, Erstellen einer neuen Datei (empfohlen, da Sie Ihr Skript bei einer Unterbrechung einfach erneut ausführen können):
cut -d , -f 1,3 <foo >foo.new &&
mv -f foo.new foo
cut
, Ersetzen der Datei an Ort und Stelle (behält das Eigentum und die Berechtigungen von foo
, muss aber vor Unterbrechungen geschützt werden):
cp -f foo foo.old &&
cut -d , -f 1,3 <foo.old >foo &&
rm foo.old
Ich empfehle eine der cut
-basierten Methoden. Auf diese Weise sind Sie nicht auf ein nicht standardmäßiges Tool angewiesen. Sie können das beste Tool für den Job verwenden und das Verhalten bei Unterbrechungen steuern.
.old
Methode für Änderungen an Ort und Stelle,echo "$(cut -d , -f 1,3 <foo)" > foo
cut -d , -f 1,3 foo > foo.new
rm foo
mv foo.new foo
rm foo
. Und Sie sollten nicht anrufenrm foo
, weilmv foo.new foo
es atomar ist: Es entfernt die alte Version und setzt gleichzeitig die neue Version ein.Das moreutils- Paket von Ubuntu (und auch Debian ) hat ein Programm
sponge
, das sozusagen auch Ihr Problem löst.Vom mann schwamm:
Welches würde Sie etwas tun lassen wie:
quelle
Ich denke nicht, dass das
cut
alleine möglich ist . Ich konnte es auf der Man- oder Infoseite nicht finden. Sie können so etwas tun wiemktemp
macht Sie zu einer relativ sicheren temporären Datei, in die Sie diecut
Ausgabe umleiten können.quelle
Versuchen Sie vim-way:
Dadurch wird die Datei direkt bearbeitet (so wird zuerst die Sicherung durchgeführt).
Alternativ verwenden
grep
,sed
odergawk
.quelle
Sie können slurp mit POSIX Awk verwenden:
Beispiel
quelle
Nun, da es
cut
weniger ausgibt als es liest, können Sie Folgendes tun:Dies bedeutet, dass die Standardeingabe
file
im schreibgeschützten Modus und die Standardeingabefile
im schreibgeschützten Modus ohne Kürzung (<>
) geöffnet wird .Auf diese Weise
cut
wird nur die Datei über sich selbst überschrieben. Der Rest der Datei bleibt jedoch unberührt. Zum Beispiel, wennfile
enthält:Die Ausgabe wird zu:
Die
f\nb\n
haben ersetztfoo\n
, sind aberbar
noch da. Sie müssen die Datei nachcut
Abschluss abschneiden .Mit
ksh93
können Sie dies mit dem<>;
Operator tun, der sich so<>
verhält, als ob bei erfolgreichem Befehlftruncate()
der Dateideskriptor aufgerufen wird. So:Bei anderen Shells müssten Sie das auf
ftruncate()
anderem Wege tun , wie zum Beispiel:perl
Nur dafür aufzurufen , ist hier allerdings etwas übertrieben, vor allem, wenn man bedenkt, dassperl
dies leicht gelingen kanncut
wie:Beachten Sie, dass bei allen Methoden, die ein tatsächliches Umschreiben vor Ort beinhalten, eine beschädigte Datei angezeigt wird, wenn der Vorgang auf halbem Weg unterbrochen wird. Die Verwendung einer temporären zweiten Datei vermeidet dieses Problem.
quelle