Próbuję przekonwertować pojedynczy pojedynczy cudzysłów na apostrof za pomocą tr
.
tr "`echo -e '\xE2\x80\x99'`" "`echo -e '\x27'`" < a > b
podany plik o nazwie UTF-8 o nazwie, a
który zawiera ten przykład:
We’re not a different species
“All alone?” Jeth mentioned.
OS X używa BSD tr
i daje niezły wynik:
We're not a different species
“All alone?” Jeth mentioned.
Ubuntu używa GNU tr
i daje ten paskudny wynik:
We'''re not a different species
''<9C>All alone?''<9D> Jeth mentioned.
Jak mogę dokonać tej konwersji w Ubuntu?
echo It’s easy | perl -CS -Mutf8 -pe "tr/’/'/"
Odpowiedzi:
Możesz wypróbować inne narzędzie, takie jak
sed
:Lub, ponieważ wykonujemy proste tłumaczenie, użyj
y
polecenia dosed
:GNU
tr
prawdopodobnie nie działa, ponieważ:I
’
jest postacią wielobajtową:źródło
sed
jest o wiele ładniejszy dla tego rodzaju pracy.tr
zastępuje każdy z trzech bajtów osobno'
, a więc'''
również zepsute sekwencje, w których zastąpił dwa z trzech bajtów podobnymi znakami“
i”
. Zamiast tego powinien zrozumieć trzy bajty jako razem oznaczające jeden znak i zamiast tego zastąpić.’
jest to znak wielobajtowy, możemy również użyćtr -c '[:print:][:cntrl:]' '-'
polecenia, aby zastąpić każdy znak , który nie jest drukowany , oprócz prawidłowych znaków kontrolnych, znakiem-
. I zobaczysz pojedyncze’
tłumaczenie na 3 bajty takich znaków---
. dobra uwaga na znak wielobajtowy.Jeśli chcesz również przekonwertować podwójne cudzysłowy i być może inne znaki, możesz użyć GNU
iconv
://TRANSLIT
Przyrostek mówiiconv
, że dla znaków spoza repertuaru kodowania (tutaj ASCII docelowej), można go zastąpić podobnych znaków lub sekwencji automatycznie. Bez przyrostkaiconv
poddaje się, gdy tylko znajdzie nieprzekształcalną postać.Zauważ, że
//TRANSLIT
wydaje się być rozszerzeniem GNU: POSIXiconv
go nie obsługuje.źródło
Możesz użyć jednego z tych
awk
rozwiązań:Lub
źródło
Użyj
-s
opcjitr
:Od
man tr
:źródło