
Ich versuche, einRechtes einfaches Anführungszeichenzu einemApostrophmit tr
.
tr "`echo -e '\xE2\x80\x99'`" "`echo -e '\x27'`" < a > b
gegeben ist eine UTF-8-kodierte Datei namens, a
die dieses Beispiel enthält:
We’re not a different species
“All alone?” Jeth mentioned.
OS X verwendet BSD tr
und liefert ein schönes Ergebnis:
We're not a different species
“All alone?” Jeth mentioned.
Ubuntu verwendet GNU tr
und erzeugt dieses hässliche Ergebnis:
We'''re not a different species
''<9C>All alone?''<9D> Jeth mentioned.
Wie kann ich diese Konvertierung in Ubuntu durchführen?
Antwort1
Sie könnten ein anderes Tool ausprobieren, wie zum Beispiel sed
:
$ sed "s/’/'/g" <a
We're not a different species
“All alone?” Jeth mentioned.
Oder verwenden Sie, da es sich um eine einfache Übersetzung handelt, den y
Befehl für sed
:
$ sed "y/’/'/" <a
We're not a different species
“All alone?” Jeth mentioned.
GNUtr
funktioniert vermutlich nicht, weil:
Derzeit
tr
werden nur Einzelbyte-Zeichen vollständig unterstützt. Später werden auch Mehrbyte-Zeichen unterstützt. Wenn dies der Fall ist,-C
wird die Option dazu führen, dass der Zeichensatz ergänzt wird, während die Option-c
dazu führt, dass der Wertesatz ergänzt wird. Diese Unterscheidung ist nur dann von Bedeutung, wenn einige Werte keine Zeichen sind, und dies ist nur in Gebietsschemas möglich, die Mehrbyte-Kodierungen verwenden, wenn die Eingabe Kodierungsfehler enthält.
Und ’
ist ein Multibyte-Zeichen:
$ echo -n \' | wc -c
1
$ echo -n ’ | wc -c
3
Antwort2
Wenn Sie auch die Anführungszeichen und eventuell andere Zeichen konvertieren möchten, können SieGNUiconv
:
$ iconv -f utf-8 -t ascii//translit < a
We're not a different species
"All alone?" Jeth mentioned.
Das //TRANSLIT
Suffix gibt an iconv
, dass es für Zeichen außerhalb des Repertoires der Zielkodierung (hier ASCII) automatisch ähnlich aussehende Zeichen oder Sequenzen ersetzen kann. Ohne das Suffix iconv
gibt es auf, sobald es ein nicht übersetzbares Zeichen findet.
Beachten Sie, dass //TRANSLIT
es sich anscheinend um eine GNU-Erweiterung handelt:POSIXiconv
unterstützt es nicht.
Antwort3
Sie können eine dieser awk
Lösungen verwenden:
awk '{gsub(/\xE2\x80\x99/, "\x27");print}' file # with Hex ASCII code
awk '{gsub(/’/, "\x27");print}' file
awk '{gsub(/\342\200\231/, "\47");print}' file # with Octal ASCII code
awk '{gsub(/’/, "\47");print}' file
Oder
awk '{gsub(/’/, "'"'"'");print}' file
Antwort4
Nutzen Sie -s
die Option tr
:
$ echo "We’re not a different species"|tr -s "’" "'"
We're not a different species
Aus man tr
:
--truncate-set1
first truncate SET1 to length of SET2