Вопрос по bash, replace – Как удалить все диакритические знаки из файла?

30

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

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 Ü.

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

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

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

Сед, возможно, не лучший инструмент для этой работы; iconv наверное лучше. увидеть:stackoverflow.com/questions/8562354/… Wooble

Ваш Ответ

8   ответов
2

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

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

0

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

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ù"}
10

sed -i 'y/āáǎàēéěèīíǐìōóǒòūúǔùǖǘǚǜĀÁǍÀĒÉĚÈĪÍǏÌŌÓǑÒŪÚǓÙǕǗǙǛ/aaaaeeeeiiiioooouuuuüüüüAAAAEEEEIIIIOOOOUUUUÜÜÜÜ/' file
Это единственный, который работалout-of-the-box
Интересно, что если вы работаете на Mac, вам нужно добавить флаг -e в командную строку. Больше информации:stackoverflow.com/questions/16745988/…
Mac OS X:sed -e 'y/āáǎàçēéěèīíǐìōóǒòūúǔùǖǘǚǜüĀÁǍÀĒÉĚÈĪÍǏÌŌÓǑÒŪÚǓÙǕǗǙǛÜ/aaaaceeeeiiiioooouuuuuuuuuAAAAEEEEIIIIOOOOUUUUUUUUU/' file Примечание. Для своих нужд я не сохранил & # xFC; персонаж.
0

что ваш регион должен быть установлен!

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

export LC_ALL=en_US.iso88591

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

locale -a
7

iconv так как он обрабатывает все варианты акцентов:

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

iconv:

//TRANSLIT
When the string "//TRANSLIT" is appended to --to-code, transliteration is activated. This means that when a character cannot be represented in the target character set, it can be approximated through one or several similarly looking characters.

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

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.
Это работает хорошо, за исключением того, что я хочу, чтобы метки исчезали только из & # xFC ;, но не из-за умлаута. Village
отman iconv, В ответ я также упомянул справочную страницу iconv. Моя текущая версияiconv (GNU libc) 2.21  Но ответ был опубликован 3 года назад, я не знаю, какая версия у меня была тогда. @Jongware
Кент, я хотел добавить прямую ссылку для & quot; the & quot; справочная страница дляiconv - но ни один из найденных мной не содержал этой конкретной цитаты. Хотите добавить, откуда вы это взяли?
echo 'á' | iconv -f utf8 -t ascii//TRANSLIT дает мне'a вместоa в macOS по умолчанию iconv (GNU libiconv 1.11)
2

tr(1) команда для. Например:

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

Возможно, вам придется проверить / изменить свойLANG Переменная окружения для соответствия используемому набору символов.

1

Ты можешь использоватьman iso_8859_1 (или ваш набор символов) илиod -bc определить восьмеричное представление диакритического знака. Тогда используйтеgawk сделать замену.

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

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

Похожие вопросы