bash - que - reglas del acento diacritico
¿Cómo eliminar todos los signos diacríticos de un archivo? (8)
Esto podría funcionar para usted:
sed -i ''y/āáǎàēéěèīíǐìōóǒòūúǔùǖǘǚǜĀÁǍÀĒÉĚÈĪÍǏÌŌÓǑÒŪÚǓÙǕǗǙǛ/aaaaeeeeiiiioooouuuuüüüüAAAAEEEEIIIIOOOOUUUUÜÜÜÜ/'' file
Tengo un archivo que contiene muchas vocales con signos diacríticos. Necesito hacer estos reemplazos:
- Reemplace ā, á, ǎ, y à con a.
- Reemplace ē, é, ě, y è con e.
- Reemplace ī, í, ǐ, y ì con i.
- Reemplace ō, ó, ǒ, y ò con o.
- Reemplace ū, ú, ǔ, y ù con u.
- Reemplace ǖ, ǘ, ǚ, y ǜ con ü.
- Reemplace Ā, Á, Ǎ, y À con A.
- Reemplace Ē, É, Ě, y È con E.
- Reemplace Ī, Í, Ǐ, y Ì con I.
- Reemplace Ō, Ó, Ǒ, y Ò con O.
- Reemplace Ū, Ú, Ǔ, y Ù con U.
- Reemplace Ǖ, Ǘ, Ǚ, y Ǜ con Ü.
Sé que puedo reemplazarlos uno a la vez con esto:
sed -i ''s/ā/a/g'' ./file.txt
¿Hay alguna manera más eficiente de reemplazar todos estos?
Esto puede no funcionar. ¡Solo porque tu locale debe estar configurado!
use la configuración regional para establecer LC_ALL, por ejemplo:
export LC_ALL=en_US.iso88591
Tenga en cuenta que la lista completa de configuraciones regionales está disponible a través de:
locale -a
Me gusta iconv
ya que maneja todas las variaciones de acentos:
cat non-ascii.txt | iconv -f utf8 -t ascii//TRANSLIT//IGNORE > ascii.txt
Para esto, el comando tr (1) es para. Por ejemplo:
tr ''āáǎàēéěèīíǐì...'' ''aaaaeeeeiii...'' <infile >outfile
Puede que tenga que verificar / cambiar su variable de entorno LANG
para que coincida con el conjunto de caracteres que se utiliza.
Puede usar man iso_8859_1
(o su conjunto de caracteres) o od -bc
para identificar la representación octal del signo diacrítico. Entonces usa gawk
para hacer el reemplazo.
{ gsub(//344/,"a"; print $0 }
Esto reemplaza ä
con a
.
Puedes usar algo como esto:
sed -e ''s/[àâ]/a/g;s/[ọõ]/o/g;s/[í,ì]/i/g;s/[ê,ệ]/e/g''
simplemente agregue más caracteres a [..] para su necesidad.
Si revisa la página del manual de la herramienta iconv
:
// TRANSLIT
Cuando la cadena "// TRANSLIT" se adjunta a --to-code, la transliteración se activa. Esto significa que cuando un personaje no puede ser representado en el juego de caracteres objetivo, puede ser aproximado a través de uno o varios personajes de aspecto similar.
entonces podríamos 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.
Si usted, como yo, necesita reemplazar los acentos solo en algunos lugares especiales del texto de su 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''
Salida
{"doNotReplaceKey":"bábögêjírù","replaceValueKey":"babogejiru","anotherNotReplaceKey":"bábögêjírù"}