Ich benutze sowohl Linux als auch FreeBSD (insbesondere Debian Linux und PC-BSD) und fand etwas Seltsames sed
.
Ich muss häufig Dateien mit "durch Tabulatoren getrennten Werten" in "durch Kommas getrennte Werte" konvertieren. Die einfachste Methode, die ich kenne, ist die folgende sed
:
sed 's/\t/,/g' inputFile.txt > outputFile.csv
Dies funktioniert perfekt unter Linux: Es ersetzt jeden Tabulator mit einem Komma ... aber unter FreeBSD ersetzt es nichts !!!
Vermisse ich etwas? Gibt es bei FreeBSD sed
eine andere Syntax als bei Linux?
-E
Option macht den Trick (sowohl unter FreeBSD als auch unter Mac OS X).Ja, es gibt verschiedene Unterschiede, das Verhalten
-i
, das einzige zu sein, von dem ich etwas weiß.Ich habe noch nie BSD verwendet, daher kann ich nicht wirklich mit den Details helfen, aber es könnte eine Problemumgehung sein,
tr
stattdessen Folgendes zu verwenden :Ein angenehmer Nebeneffekt ist,
tr
dass deutlich schneller sein sollte. Ich habe das auf meinem Linux mit einer Testdatei mit 50000 Zeilen getestet, von denen jede 2 Registerkarten hatte:quelle
tr '\t' ,
ist tragbarer alstr $'\t' ,
.tr '[\t]' '[,]'
wäre sogar portabel auf einige alte SysV-Systeme.cut
. Die POSIX-Spezifikation fürtr
ist da . Ich habe mich geirrt, was das[
alte SysV betrifft. Wie die POSIX-Spezifikation hervorhebt,[
wird dies nur für Bereiche dort benötigt.Ja, im Gegensatz zu GNU interpretiert
sed
FreeBSDsed
keine ANSI C-Escape-Sequenzen wie\t
in regulären Ausdrücken.Eine Möglichkeit, in diesem Fall einen am wenigsten verbreiteten Nenner zu erhalten, ist die Verwendung von
printf
.Das Verhalten
sed -i
für direkte Dateiänderungen kann kompatibel gemacht werden, wenn ein Schalter oder eine Option unmittelbar auf den-i
Schalter folgt , z. B.sed -i -e 's/x/X/g' file
sowohl für GNUsed
als auch für FreeBSDsed
.Neuere Versionen von FreeBSD
sed
(FreeBSD 8.1 oder neuer) haben den-r
Schalter, um die Kompatibilität mit GNU zu erhöhensed
.(Darüber hinaus ist die Verwendung von POSIX-Zeichenklassen in
sed
regulären Ausdrücken eine gute Möglichkeit, um die Kompatibilität sicherzustellen.)Für eine alternative, POSIX-konforme
sed
Implementierung siehe: Minimiert - eine kleinere, billigere, schnellere SED-Implementierung .quelle
Sie sollten TABstatt der
\t
folgenden Zeichen ein Literal verwenden :Siehe diesen Kommentar von Stephane zu einer anderen Frage.
Der folgende Artikel könnte Sie auch interessieren:
Ich zitiere den relevanten Teil:
quelle
Nach dem Einloggen sehe ich die nächste Ansage und speichere sie. Hoffe, es wird auch für andere nützlich sein
quelle
-i
Option wurde bereits abgedeckt , obwohl