Как удалить все диакритики из файла?

У меня есть файл, содержащий много гласных с диакритикой. Мне нужно сделать эти замены:

  • Замените ā, á, ǎ и à на a.
  • Замените ē, é, ě и è на e.
  • Замените ī, í, ǐ и ì с i.
  • Замените ō, ó, ǒ и ò на o.
  • Заменим ū, ú, ǔ и ù с u.
  • Замените ǖ, ǘ, ǚ и ǜ с помощью ü.
  • Замените À, Á, Ǎ и À с помощью A.
  • Замените Ē, É, Ě и È на E.
  • Заменим Ī, Í, Ǐ и Ì с I.
  • Замените Ō, Ó, Ǒ и Ò на O.
  • Заменим Ū, Ú, Ǔ и Ù с U.
  • Замените Ǖ, Ǘ, Ǚ и Ǜ с помощью Ü.

Я знаю, что я могу заменить их по одному с этим:

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

Есть ли более эффективный способ заменить все эти?

Ответ 1

Если вы проверите man-страницу инструмента iconv:

//TRANSLIT
Когда строка "//TRANSLIT" добавляется к -to-коду, транслитерация активируется. Это означает, что, когда символ не может быть представлен в                   целевой набор символов, он может быть аппроксимирован одним или несколькими похожими символами.

чтобы мы могли сделать:

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.

Ответ 2

Это может сработать для вас:

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

Ответ 3

Мне нравится iconv, поскольку он обрабатывает все вариации акцентов:

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

Ответ 4

Для этого используется команда tr (1). Например:

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

Вам может потребоваться проверить/изменить переменную среды LANG в соответствии с используемым набором символов.

Ответ 5

Вы можете использовать что-то вроде этого:

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

просто добавьте больше символов в [..] для ваших нужд.

Ответ 6

Вы можете использовать man iso_8859_1 (или ваш набор char) или od -bc, чтобы идентифицировать восьмеричное представление диакритики. Затем используйте gawk для замены.

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

Это заменяет ä на a.

Ответ 7

Это может не сработать. Просто потому, что ваш язык должен быть установлен!

используйте locale для установки LC_ALL, например:

export LC_ALL=en_US.iso88591

Обратите внимание, что полный список локалей доступен через:

locale -a

Ответ 8

Если вам, как и мне, нужно заменить акценты только в некоторых специальных местах вашего файла, вы можете сделать это, используя это регулярное выражение

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'

Выход

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