2012-04-18 16 views
24

Tengo un archivo que contiene muchas vocales con signos diacríticos. Necesito hacer estos reemplazos:¿Cómo eliminar todos los signos diacríticos de un archivo?

  • Reemplace ā, á, ǎ, y à con a.
  • Reemplace ē, é, ě, y è con e.
  • Reemplace ī, í, ǐ, y ì con i.
  • Reemplazar ō, ó, ǒ, y ò con o.
  • Reemplace ū, ú, ǔ, y ù con ud.
  • Reemplace ǖ, ǘ, ǚ, y ǜ con ü.
  • Reemplazar A, a, ǎ, y una con A.
  • Reemplazar E, E, E, y E con E.
  • Reemplazar I, i, ǐ, y con I.
  • reemplace la junta , Ó, Ǒ, y Ò con O.
  • Reemplazar Ū, Ú, Ǔ y U con U.
  • Reemplazar Ǖ, Ǘ, Ǜ y Ǜ con Ü.

Sé que puedo sustituirlos por uno a la vez con esto:

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

¿Hay una manera más eficiente para reemplazar la totalidad de estos?

+3

sed posiblemente no sea la mejor herramienta para este trabajo; iconv es probablemente mejor. ver: http://stackoverflow.com/questions/8562354/remove-unicode-characters-from-textfiles-sed-other-bash-shell-methods – geoffspear

Respuesta

43

Si marca la página del manual de la herramienta iconv:

// TRANSLIT
Cuando la cadena "// TRANSLIT" se anexa a --a de código, se activa la transcripción. Esto significa que cuando un personaje no puede representarse en el conjunto de caracteres de destino , se lo puede aproximar a través de uno o varios caracteres de aspecto similar.

por lo que podría hacer:

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

Esto funciona bien, excepto que sólo quiero a las marcas desaparecen de la U, pero no la diéresis. – Village

+0

Kent, quería agregar un enlace directo para "la" página de manual para 'iconv', pero ninguno de los que encontré contenía esa cita en particular. ¿Le gustaría agregar de dónde lo sacó? – usr2564301

+1

de 'man iconv'. En respuesta también mencioné la página man de iconv. Mi versión actual es 'iconv (GNU libc) 2.21' Pero la respuesta fue publicada hace 3 años, no sé qué versión tenía entonces. @Jongware – Kent

2

Para esto, el comando tr (1) es para. Por ejemplo:

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

Usted puede tener que comprobar/cambiar la variable de entorno LANG a coincidir con el juego se utiliza el carácter.

2

se puede usar algo como esto:

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

sólo tiene que añadir más personajes para [..] para su necesidad.

6

Esto podría funcionar para usted:

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

Ese es el único que trabajó _out-de-la-Box_ – ATorras

+0

Curiosamente si está en Mac, deberá agregar el distintivo -e a la línea de comando. Más información: http://stackoverflow.com/questions/16745988/sed-command-works-fine-on-ubuntu-but-not-mac – MrWashinton

6

me gusta iconv ya que maneja todas las variaciones acentos:

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

Esto no puede trabajar. ¡Solo porque tu locale debe estar configurado!

uso local para establecer LC_ALL, por ejemplo:

export LC_ALL=en_US.iso88591 

Tenga en cuenta que la lista completa de los lugares está disponible a través de:

locale -a 
0

Si, como yo, necesita reemplazar los acentos solo en algunos lugares especiales de su texto de archivo, puede hacerlo utilizando este tipo de expresiones regulares

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

Puede utilizar man iso_8859_1 (o su juego de caracteres) o od -bc para identificar la representación octal de la diacrítica. Luego use gawk para hacer la sustitución.

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

Esto reemplaza ä con a.

Cuestiones relacionadas