Das sollte eigentlich ganz einfach sein, aber aus irgendeinem Grund funktioniert es nicht:
sed -i.bak -E 's/\t/ /' file.txt
Anstatt die Tabulatorzeichen zu ersetzen, werden die t
Zeichen ersetzt. Ich habe jede erdenkliche Variation ausprobiert, mit Zitaten gespielt usw. Ich habe gegoogelt und festgestellt, dass alle anderen ziemlich ähnliche Ausdrücke verwenden, und sie scheinen für sie zu funktionieren.
Das -E
ist eine OS X Sache. Ich dachte, der Fehler könnte auf eine seltsame Eigenart von OS X zurückzuführen sein sed
, also habe ich es auch mit Ruby (ohne das -i
) versucht und das gleiche Ergebnis erzielt:
ruby -pe '$_.gsub!(/\t/," ")' < file.txt > file.new
Ich verwende Bash 3.2.51 unter OS X und iTerm, obwohl ich nicht sehe, wie all das fürchterlich relevant sein könnte. Ich habe keine seltsamen Umgebungsvariablen festgelegt, obwohl ich alle veröffentlichen kann, die Sie für relevant halten.
Was könnte falsch sein?
UPDATE : Ich muss einen anderen Fehler oder Tippfehler begangen haben, als ich die Ruby-Version ausprobiert habe, da Gilles darauf hinweist, dass es funktioniert (und er hat mich nie falsch gelenkt!). Ich bin mir nicht sicher, was passiert ist, aber ich bin mir ziemlich sicher, dass es mein Fehler gewesen sein muss.
quelle
\t
in dersed
mit Anweisung ,CTRL-V<TAB>
wo<TAB>
die Tab - Taste undCTRL-V
Strg - Taste ist undv
zusammengedrückt wird .Antworten:
Die Syntax
\t
für ein Tabulatorzeichen in sed ist nicht Standard. Diese Flucht ist eine GNU sed-Erweiterung . Sie finden viele Beispiele online, die es verwenden, weil viele Leute GNU sed verwenden (es ist die sed-Implementierung auf nicht eingebettetem Linux). Aber OS X sed unterstützt , wie andere * BSD sed, keine\t
Tabulatoren und behandelt diese stattdessen\t
als Backslash gefolgt vont
.Es gibt viele Lösungen, wie zum Beispiel:
Verwenden Sie ein literales Tabulatorzeichen.
Verwenden Sie
tr
oderprintf
, um ein Tabulatorzeichen zu erzeugen.Verwenden Sie die Zeichenfolgensyntax von bash, um umgekehrte Schrägstriche zuzulassen .
Verwenden Sie Perl, Python oder Ruby. Das von Ihnen veröffentlichte Ruby-Snippet funktioniert.
quelle
...sed
Skript enthalten sind (über-f
Option verwendet), scheinen mir die literalen Tabulatorzeichen die einzige Möglichkeit zu sein. Bei der Bearbeitung mit vimset noexpandtab
ist dies wichtig.tr
Wenden Sie diese Technik nur an, wenn Ihr Kollege Ihnen beim Lesen Ihres Drehbuchs ins Gesicht stechen soll.sed $'s/<regex>/\t/' file.txt
funktioniert zum Einfügen, aber das$
scheint mein Skript zused $'s,\(ontology/[0-9]\+\),\t\txxx\1xxx\t\t,'
beschädigen, wenn ich versuche, einen Teil des regulären Ausdrucks in meine Ersetzung aufzunehmen, dh xxxxxx, wobei mein erwarteter Übereinstimmungswert durch `` ersetzt wird. Gibt es eine Entsprechung zur\1
Verwendung der Zeichenfolgensyntax von bash? Edit: Es soll das U + 231C Unicode-Zeichen in der Mitte des xxx <U + 231C> xxx geben.Verwenden Sie ein Bash-spezifisches Anführungszeichen, mit dem Sie Zeichenfolgen wie in C verwenden können, sodass ein reales Tabulatorzeichen an sed übergeben wird, keine Escape-Sequenz:
quelle
Wie bereits erwähnt, unterstützen nicht alle
sed
Implementierungen die Schreibweise\t
als horizontale Registerkarte.Sie können Ihre Substitution leicht erreichen mit:
Dadurch wird eine in situ-Ersetzung durchgeführt, bei der Ihre ursprüngliche Datei als "* .old" erhalten bleibt. Perl erlaubt alternative Trennzeichen für den Klassiker,
/
wodurch der Ausdruck viel besser lesbar wird (dh ohne das "Leaning Toothpick" -Syndrom).Das
+
besagt, dass eine oder mehrere Wiederholungen eines Tabulatorzeichens ersetzt werden sollen. Derg
Modifikator ermöglicht globale Ersetzungen am Ende jeder Zeile.quelle
funktioniert für mich unter OS X und ist derselbe Befehl, den ich unter Linux die ganze Zeit benutze.
quelle
Sie können auch
echo
drinnen verwendensed
:sed -i "s/$(echo '\t')//g"
quelle
echo '\t'
nur\t
in der Implementierung einiger Shells von ausgegeben wirdecho
.Wenn Sie ein leistungsfähigeres
sed
(unterstützendes\t
und mehr) als das unter OS X wollen, installieren Sie GNU sed .quelle
sed
das Problem ist. Haben Sie einen Grund zu der Annahme, dass dies das Problem ist? Ich würde gerne GNU sed installieren, wenn ich Grund zur Annahme hätte, dass es das Problem lösen würde, aber anscheinend habe ich das so ziemlich ausgeschlossen.ruby -pe '$_.gsub!(/\t/," ")' < file.txt
Wenn es in Ordnung ist, etwas anzufordern
bash
oderzsh
als Shell, dann ist dies die einfachste Lösung, die ich mir vorstellen kann:Beachten Sie jedoch, dass
echo
Flags (-n
und-e
) in POSIX undefiniert sind, sodass eine POSIX-konforme Shell diese Flags nicht verstehen muss, viele jedoch aus Kompatibilitätsgründen.quelle
Ich bin überrascht, dass niemand die sehr einfache Lösung vorgeschlagen hat:
sed -i.bak -E 's/\\\t/ /' file.txt
Das sollte den Trick machen.Sie müssen das Escape-Zeichen (daher die 3 \ s) umgehen, damit sed versteht, dass Sie versuchen, ein \ t-Zeichen im regulären Ausdruck zu verwenden, wenn alles ersetzt wird ...
quelle
sed
, reicht eins\
aus, da kein Fluchtweg nötig ist. Das Problem ist, dass BSDsed
diese Syntax für Tabs nicht unterstützt.Das hat bei mir funktioniert.
sed-es / [\ t] / / g '
quelle
sed
. Dies ist nicht das, was das OP verwendet.