J'ai un fichier contenant beaucoup de voyelles avec des signes diacritiques. J'ai besoin de faire ces remplacements:
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?
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.
Cela pourrait fonctionner pour vous:
sed -i 'y/āáǎàēéěèīíǐìōóǒòūúǔùǖǘǚǜĀÁǍÀĒÉĚÈĪÍǏÌŌÓǑÒŪÚǓÙǕǗǙǛ/aaaaeeeeiiiioooouuuuüüüüAAAAEEEEIIIIOOOOUUUUÜÜÜÜ/' file
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
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é.
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.
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
.
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ù"}
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