web-dev-qa-db-fra.com

Comment supprimer tous les signes diacritiques d'un fichier?

J'ai un fichier contenant beaucoup de voyelles avec des signes diacritiques. J'ai besoin de faire ces remplacements:

  • Remplacez à, á, ǎ et à par a.
  • Remplacez ē, é, ě et è par e.
  • Remplacez ī, í, ǐ et «par i.
  • Remplacez ō, ó, ǒ et ò par o.
  • Remplacez ū, ú, ǔ et ù par u.
  • Remplacez ǖ, ǘ, ǚ et ǜ par ü.
  • Remplacez Â, Á, Ǎ et À par A.
  • Remplacez, É, Ě et È par E.
  • Remplacez Ī, Í, Ǐ et Ì par I.
  • Remplacez Ō, Ó, Ǒ et Ò par O.
  • Remplacez Ū, Ú, Ǔ et Ù par U.
  • Remplacez Ǖ, Ǘ, Ǚ et Ǜ par Ü.

Je sais que je peux les remplacer un par un par ceci:

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

Existe-t-il un moyen plus efficace de remplacer tout cela?

30
Village

Si vous consultez la page de manuel de l'outil iconv:

// TRANSLIT
Lorsque la chaîne "// TRANSLIT" est ajoutée à --to-code, la translittération est activée. Cela signifie que lorsqu'un personnage ne peut pas être représenté dans le jeu de caractères cible, il peut être approché par l’intermédiaire d’un ou de plusieurs caractères similaires.

afin que nous puissions faire:

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.
48
Kent

Cela pourrait fonctionner pour vous:

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

J'aime iconv car il gère toutes les variations d'accents:

cat non-ascii.txt | iconv -f utf8 -t ascii//TRANSLIT//IGNORE > ascii.txt
7
Fedir RYKHTIK

Pour cela, la commande tr (1) est pour. Par exemple:

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

Vous devrez peut-être vérifier/modifier votre variable d'environnement LANG pour qu'elle corresponde au jeu de caractères utilisé.

2
ktf

Vous pouvez utiliser quelque chose comme ceci:

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

ajoutez simplement plus de caractères à [..] pour répondre à vos besoins. 

2
hungnv

Vous pouvez utiliser man iso_8859_1 (ou votre jeu de caractères) ou od -bc pour identifier la représentation octale du diacritique. Utilisez ensuite gawk pour effectuer le remplacement.

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

Ceci remplace ä par a.

1
Rich Traube

Si, comme moi, vous devez remplacer les accents uniquement à certains endroits spécifiques de votre fichier texte, vous pouvez le faire en utilisant ce type de regex

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'

Sortie

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

Cela peut ne pas fonctionner. Tout simplement parce que vos paramètres régionaux doivent être définis!

utilisez les paramètres régionaux pour définir LC_ALL, par exemple:

export LC_ALL=en_US.iso88591

Notez que la liste complète des paramètres régionaux est disponible via:

locale -a
0
Bruno