tr: Apostroph in ASCII umwandeln

tr: Apostroph in ASCII umwandeln

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, adie dieses Beispiel enthält:

We’re not a different species
“All alone?” Jeth mentioned.

OS X verwendet BSD trund liefert ein schönes Ergebnis:

We're not a different species
“All alone?” Jeth mentioned.

Ubuntu verwendet GNU trund 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 yBefehl für sed:

$ sed "y/’/'/" <a
We're not a different species
“All alone?” Jeth mentioned.

GNUtrfunktioniert vermutlich nicht, weil:

Derzeit trwerden 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 //TRANSLITSuffix 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 iconvgibt es auf, sobald es ein nicht übersetzbares Zeichen findet.

Beachten Sie, dass //TRANSLITes sich anscheinend um eine GNU-Erweiterung handelt:POSIXiconvunterstützt es nicht.

Antwort3

Sie können eine dieser awkLö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 -sdie 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

verwandte Informationen