2012-04-18 13 views
24

Mam plik zawierający wiele samogłosek z znakami diakrytycznymi. Muszę wykonać te zamienniki:Jak usunąć wszystkie znaki diakrytyczne z pliku?

  • Zamień ā, á, ǎ i a na a.
  • Wymień ē, é, ě i è za pomocą e.
  • Wymień ī, í, ǐ i ì za pomocą i.
  • Zamień ō, ó, ǒ i ò na o.
  • Zamień ū, ú, ǔ i ù na u.
  • Wymień ǖ, ǘ, ǚ i ǜ na ü.
  • zastąpić, A Ǎ oraz z A.
  • wymienić E, E, E, E z E.
  • wymienić I, I, Ǐ, i w I.
  • Wymiana o , Ó, Ǒ i Ò z O.
  • Wymień Ū, Ú, Ǔ i Ù na U.
  • Wymień Ǖ, Ǘ, Ǚ i Ǜ na Ü.

wiem, że mogę zastąpić je jeden na raz z tym:

sed -i 's/ā/a/g' ./file.txt 

Czy jest bardziej efektywny sposób wymienić wszystkich z nich?

+3

sed prawdopodobnie nie jest najlepszym narzędziem do tej pracy; iconv jest prawdopodobnie lepszy. zobacz: http://stackoverflow.com/questions/8562354/remove-unicode-characters-from-textfiles-sed-other-bash-shell-methods – geoffspear

Odpowiedz

43

Jeśli zaznaczysz stronę man narzędzia iconv:

// translit
Kiedy napis "// translit" jest dołączany do --to-code, transliteracja jest aktywna. Oznacza to, że gdy postać nie może być reprezentowana w docelowym zestawie znaków , może być ona przybliżona za pomocą jednego lub kilku podobnie wyglądających znaków.

więc mogliśmy zrobić:

kent$ cat test1 
    Replace ā, á, ǎ, and à with a. 
    Replace ē, é, ě, and è with e. 
    Replace ī, í, ǐ, and ì with i. 
    Replace ō, ó, ǒ, and ò with o. 
    Replace ū, ú, ǔ, and ù with u. 
    Replace ǖ, ǘ, ǚ, and ǜ with ü. 
    Replace Ā, Á, Ǎ, and À with A. 
    Replace Ē, É, Ě, and È with E. 
    Replace Ī, Í, Ǐ, and Ì with I. 
    Replace Ō, Ó, Ǒ, and Ò with O. 
    Replace Ū, Ú, Ǔ, and Ù with U. 
    Replace Ǖ, Ǘ, Ǚ, and Ǜ with Ü. 


kent$ iconv -f utf8 -t ascii//TRANSLIT test1 
    Replace a, a, a, and a with a. 
    Replace e, e, e, and e with e. 
    Replace i, i, i, and i with i. 
    Replace o, o, o, and o with o. 
    Replace u, u, u, and u with u. 
    Replace u, u, u, and u with u. 
    Replace A, A, A, and A with A. 
    Replace E, E, E, and E with E. 
    Replace I, I, I, and I with I. 
    Replace O, O, O, and O with O. 
    Replace U, U, U, and U with U. 
    Replace U, U, U, and U with U. 
+3

To działa dobrze, oprócz tego, że chcę tylko, aby znaki zniknęły z ü, ale nie umlaut. – Village

+0

Kent, chciałem dodać bezpośredni link do "strony" man dla 'iconv' - ale żaden z znalezionych nie zawierał tego konkretnego cytatu. Czy chcesz dodać skąd go masz? – usr2564301

+1

z 'man iconv'. W odpowiedzi wspomniałem także o stronie man iconv. Moja obecna wersja to 'iconv (GNU libc) 2.21' Ale odpowiedź została opublikowana 3 lata temu, nie wiem, którą wersję miałem wtedy. @ Jongware – Kent

2

Do tego służy polecenie tr (1). Na przykład:

tr 'āáǎàēéěèīíǐì...' 'aaaaeeeeiii...' <infile >outfile 

może trzeba sprawdzić/zmienić zmienną środowiskową LANG dopasować zestaw znaków używany.

2

Można użyć czegoś takiego:

sed -e 's/[àâ]/a/g;s/[ọõ]/o/g;s/[í,ì]/i/g;s/[ê,ệ]/e/g' 

wystarczy dodać więcej znaków do [..] do potrzeb użytkownika.

6

To może pracować dla Ciebie:

sed -i 'y/āáǎàēéěèīíǐìōóǒòūúǔùǖǘǚǜĀÁǍÀĒÉĚÈĪÍǏÌŌÓǑÒŪÚǓÙǕǗǙǛ/aaaaeeeeiiiioooouuuuüüüüAAAAEEEEIIIIOOOOUUUUÜÜÜÜ/' file 
+0

To jest jedyny, który działał _out-of-the-box_ – ATorras

+0

Co ciekawe, jeśli jesteś na Macu musisz dodać flagę -e do linii poleceń. Więcej informacji: http://stackoverflow.com/questions/16745988/sed-command-works-fine-on-ubuntu-but-not-mac – MrWashinton

6

Lubię iconv gdyż obsługuje wszystkie odmiany akcenty:

cat non-ascii.txt | iconv -f utf8 -t ascii//TRANSLIT//IGNORE > ascii.txt 
0

ta może nie działać. Tylko dlatego, że twoje ustawienia regionalne muszą być ustawione!

use locale ustawić LC_ALL, na przykład:

export LC_ALL=en_US.iso88591 

nocie, że pełna lista lokalizacjach jest dostępna za pośrednictwem:

locale -a 
0

Jeśli, tak jak ja, trzeba wymienić akcenty tylko w niektórych specjalnych miejscach w tekście pliku można to zrobić za pomocą tego rodzaju wyrażeń:

echo '{"doNotReplaceKey":"bábögêjírù","replaceValueKey":"bábögêjírù","anotherNotReplaceKey":"bábögêjírù"}' \ 
    | sed -e ':a;s/replaceValueKey":"\([a-zA-Z0-9 -_]*\)[áâàãä]/replaceValueKey":"\1a/g;ta' \ 
    | sed -e ':a;s/replaceValueKey":"\([a-zA-Z0-9 -_]*\)[éêèë]/replaceValueKey":"\1e/g;ta' \ 
    | sed -e ':a;s/replaceValueKey":"\([a-zA-Z0-9 -_]*\)[íîìï]/replaceValueKey":"\1i/g;ta' \ 
    | sed -e ':a;s/replaceValueKey":"\([a-zA-Z0-9 -_]*\)[óôòõö]/replaceValueKey":"\1o/g;ta' \ 
    | sed -e ':a;s/replaceValueKey":"\([a-zA-Z0-9 -_]*\)[úûùü]/replaceValueKey":"\1u/g;ta' 

Ou tput

{"doNotReplaceKey":"bábögêjírù","replaceValueKey":"babogejiru","anotherNotReplaceKey":"bábögêjírù"} 
1

Można użyć man iso_8859_1 (lub zestawu znaków) lub od -bc zidentyfikować oktalnym reprezentację diakrytycznego. Następnie użyj gawk, aby dokonać wymiany.

{ gsub(/\344/,"a"; print $0 } 

Zastępuje ä z a.

Powiązane problemy