Как удалить все диакритики из файла?
У меня есть файл, содержащий много гласных с диакритикой. Мне нужно сделать эти замены:
- Замените ā, á, ǎ и à на 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ù"}