如何从文件中删除所有变音符号?
Posted
技术标签:
【中文标题】如何从文件中删除所有变音符号?【英文标题】:How to remove all of the diacritics from a file? 【发布时间】:2012-04-29 17:51:53 【问题描述】:我有一个文件,其中包含许多带有变音符号的元音。我需要进行这些替换:
将 ā、á、ǎ 和 à 替换为 a。 将 ē、é、ě 和 è 替换为 e。 将ī、í、ǐ和ì替换为i。 将 ō、ó、ǒ 和 ò 替换为 o。 将 ū、ú、ǔ 和 ù 替换为 u。 将 ǖ、ǘ、ǚ 和 ǜ 替换为 ü。 将 Ā、Á、Ǎ 和 À 替换为 A。 将 Ē、É、Ě 和 È 替换为 E。 将 Ī、Í、Ǐ 和 Ì 替换为 I。 将 Ō、Ó、Ǒ 和 Ò 替换为 O。 将 Ū、Ú、Ǔ 和 Ù 替换为 U。 将 Ǖ、Ǘ、Ǚ 和 Ǜ 替换为 Ü。我知道我可以一次更换一个:
sed -i 's/ā/a/g' ./file.txt
有没有更有效的方法来替换所有这些?
【问题讨论】:
sed 可能不是这项工作的最佳工具; iconv 可能更好。见:***.com/questions/8562354/… 【参考方案1】:如果您查看工具的手册页iconv
:
//翻译 当字符串 "//TRANSLIT" 附加到 --to-code 时,音译被激活。这意味着当一个字符不能在 目标字符集,可以通过一个或几个外观相似的字符来近似。
所以我们可以这样做:
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 U.
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.
【讨论】:
这很好用,只是我只希望标记从 ü 中消失,而不是变音符号。 Kent,我想为iconv
的“the”手册页添加一个直接链接——但我发现没有一个包含该特定引用。您想添加它的来源吗?
来自man iconv
。在回答中,我还提到了 iconv 的手册页。我目前的版本是iconv (GNU libc) 2.21
但答案是3年前发布的,我不知道我当时有哪个版本。 @Jongware
echo 'á' | iconv -f utf8 -t ascii//TRANSLIT
在 macOS 默认 iconv (GNU libiconv 1.11) 上给我'a
而不是a
此答案的旁注:当您收到 iconv: 位置非法输入序列 ... 错误时,请检查目标文件的字符集。假设您从 Microsoft Excel 导出 CSV 文件,运行 file -i test2.csv
并查看 charset=iso-8859-1
,然后使用 -f iso-8859-1
而不是 -f utf8
。【参考方案2】:
这可能对你有用:
sed -i 'y/āáǎàēéěèīíǐìōóǒòūúǔùǖǘǚǜĀÁǍÀĒÉĚÈĪÍǏÌŌÓǑÒŪÚǓÙǕǗǙǛ/aaaaeeeeiiiioooouuuuüüüüAAAAEEEEIIIIOOOOUUUUÜÜÜÜ/' file
【讨论】:
有趣的是,如果您使用的是 Mac,则必须将 -e 标志添加到命令行。更多信息:***.com/questions/16745988/… macosx:sed -e 'y/āáǎàçēéěèīíǐìōóǒòūúǔùǖǘǚǜüĀÁǍÀĒÉĚÈĪÍǏÌŌÓǑÒŪÚǓÙǕǗǙǛÜ/aaaaceeeeiiiioooouuuuuuuuuAAAAEEEEIIIIOOOOUUUUUUUUU/' file
注意:为了我的需要,我没有保留 ü 字符。
“sed”的优势在于它几乎无处不在。只是一个改进版:-e 'y/āáǎàēéěèīíǐìïōóǒòöūúǔùǖǘǚǜüĀÁǍÀĒÉĚÈĪÍǏÌŌÓǑÒŪÚǓÙǕǗǙǛÜÇçÑñ/aaaaeeeeiiiiiooooouuuuuuuuuAAAAEEEEIIIIOOOOUUUUUUUUUCcNn/'
【参考方案3】:
我喜欢 iconv
,因为它可以处理所有重音变化:
cat non-ascii.txt | iconv -f utf8 -t ascii//TRANSLIT//IGNORE > ascii.txt
【讨论】:
这对我来说将Ángel
转换为'angel
。 :(
对我来说也是如此,但在删除非 ASCII 字母后,我更喜欢这个解决方案,而不是其他解决方案,比如将 sed 命令添加为“s/[^a-zA-Z]//g” .变成:cat non-ascii.txt | iconv -f utf8 -t ascii//TRANSLIT//忽略 | sed "s/[^a-zA-Z]//g" > ascii.txt【参考方案4】:
为此,tr(1) 命令适用。例如:
tr 'āáǎàēéěèīíǐì...' 'aaaaeeeeiii...' <infile >outfile
您可能需要检查/更改您的 LANG
环境变量以匹配正在使用的字符集。
【讨论】:
【参考方案5】:#!/bin/bash
INPUT="$1"
declare -a acc
declare -a noa
acc=('$' 'è' 'ê' 'é' 'À' 'Á' 'Â' 'Ã' 'Ä' 'Å' 'Æ' 'Ç' 'È' 'É' 'Ê' 'Ë' 'Ì' 'Í' 'Î' 'Ï' 'Ð' 'Ñ' 'Ò' 'Ó' 'Ô' 'Õ' 'Ö' 'Ø' 'Ù' 'Ú' 'Û' 'Ü' 'Ý' 'ß' 'à' 'á' 'â' 'ã' 'ä' 'å' 'æ' 'ç' 'è' 'é' 'ê' 'ë' 'ì' 'í' 'î' 'ï' 'ñ' 'ò' 'ó' 'ô' 'õ' 'ö' 'ø' 'ù' 'ú' 'û' 'ü' 'ý' 'ÿ' 'Ā' 'ā' 'Ă' 'ă' 'Ą' 'ą' 'Ć' 'ć' 'Ĉ' 'ĉ' 'Ċ' 'ċ' 'Č' 'č' 'Ď' 'ď' 'Đ' 'đ' 'Ē' 'ē' 'Ĕ' 'ĕ' 'Ė' 'ė' 'Ę' 'ę' 'Ě' 'ě' 'Ĝ' 'ĝ' 'Ğ' 'ğ' 'Ġ' 'ġ' 'Ģ' 'ģ' 'Ĥ' 'ĥ' 'Ħ' 'ħ' 'Ĩ' 'ĩ' 'Ī' 'ī' 'Ĭ' 'ĭ' 'Į' 'į' 'İ' 'ı' 'IJ' 'ij' 'Ĵ' 'ĵ' 'Ķ' 'ķ' 'Ĺ' 'ĺ' 'Ļ' 'ļ' 'Ľ' 'ľ' 'Ŀ' 'ŀ' 'Ł' 'ł' 'Ń' 'ń' 'Ņ' 'ņ' 'Ň' 'ň' 'ʼn' 'Ō' 'ō' 'Ŏ' 'ŏ' 'Ő' 'ő' 'Œ' 'œ' 'Ŕ' 'ŕ' 'Ŗ' 'ŗ' 'Ř' 'ř' 'Ś' 'ś' 'Ŝ' 'ŝ' 'Ş' 'ş' 'Š' 'š' 'Ţ' 'ţ' 'Ť' 'ť' 'Ŧ' 'ŧ' 'Ũ' 'ũ' 'Ū' 'ū' 'Ŭ' 'ŭ' 'Ů' 'ů' 'Ű' 'ű' 'Ų' 'ų' 'Ŵ' 'ŵ' 'Ŷ' 'ŷ' 'Ÿ' 'Ź' 'ź' 'Ż' 'ż' 'Ž' 'ž' 'ſ' 'ƒ' 'Ơ' 'ơ' 'Ư' 'ư' 'Ǎ' 'ǎ' 'Ǐ' 'ǐ' 'Ǒ' 'ǒ' 'Ǔ' 'ǔ' 'Ǖ' 'ǖ' 'Ǘ' 'ǘ' 'Ǚ' 'ǚ' 'Ǜ' 'ǜ' 'Ǻ' 'ǻ' 'Ǽ' 'ǽ' 'Ǿ' 'ǿ');
noa=('S' 'e' 'e' 'e' 'A' 'A' 'A' 'A' 'A' 'A' 'AE' 'C' 'E' 'E' 'E' 'E' 'I' 'I' 'I' 'I' 'D' 'N' 'O' 'O' 'O' 'O' 'O' 'O' 'U' 'U' 'U' 'U' 'Y' 's' 'a' 'a' 'a' 'a' 'a' 'a' 'ae' 'c' 'e' 'e' 'e' 'e' 'i' 'i' 'i' 'i' 'n' 'o' 'o' 'o' 'o' 'o' 'o' 'u' 'u' 'u' 'u' 'y' 'y' 'A' 'a' 'A' 'a' 'A' 'a' 'C' 'c' 'C' 'c' 'C' 'c' 'C' 'c' 'D' 'd' 'D' 'd' 'E' 'e' 'E' 'e' 'E' 'e' 'E' 'e' 'E' 'e' 'G' 'g' 'G' 'g' 'G' 'g' 'G' 'g' 'H' 'h' 'H' 'h' 'I' 'i' 'I' 'i' 'I' 'i' 'I' 'i' 'I' 'i' 'IJ' 'ij' 'J' 'j' 'K' 'k' 'L' 'l' 'L' 'l' 'L' 'l' 'L' 'l' 'l' 'l' 'N' 'n' 'N' 'n' 'N' 'n' 'n' 'O' 'o' 'O' 'o' 'O' 'o' 'OE' 'oe' 'R' 'r' 'R' 'r' 'R' 'r' 'S' 's' 'S' 's' 'S' 's' 'S' 's' 'T' 't' 'T' 't' 'T' 't' 'U' 'u' 'U' 'u' 'U' 'u' 'U' 'u' 'U' 'u' 'U' 'u' 'W' 'w' 'Y' 'y' 'Y' 'Z' 'z' 'Z' 'z' 'Z' 'z' 's' 'f' 'O' 'o' 'U' 'u' 'A' 'a' 'I' 'i' 'O' 'o' 'U' 'u' 'U' 'u' 'U' 'u' 'U' 'u' 'U' 'u' 'A' 'a' 'AE' 'ae' 'O' 'o');
i=0
length=$#INPUT
while [[ $i -lt $length ]]; do
char=$INPUT:$i:1;
#echo $i:$char
j=0
for letter in "$acc[@]"
do
if [[ "$letter" == "$char" ]]; then
char="$noa[$j]"
fi
((j++))
done
((i++))
OUTPUT=$OUTPUT$char
done
echo $OUTPUT
【讨论】:
如何从文件中读取?谢谢【参考方案6】:你可以这样使用:
sed -e 's/[àâ]/a/g;s/[ọõ]/o/g;s/[í,ì]/i/g;s/[ê,ệ]/e/g'
只需根据需要向 [..] 添加更多字符。
【讨论】:
【参考方案7】:如果你和我一样,需要在文件文本的某些特殊位置替换重音符号,你可以使用这种正则表达式来做到这一点
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ù"
【讨论】:
【参考方案8】:您可以使用man iso_8859_1
(或您的字符集)或od -bc
来识别变音符号的八进制表示。然后使用gawk
进行替换。
gsub(/\344/,"a"; print $0
这会将ä
替换为a
。
【讨论】:
【参考方案9】:这可能行不通。只是因为必须设置您的语言环境!
使用 locale 设置 LC_ALL,例如:
export LC_ALL=en_US.iso88591
请注意,完整的语言环境列表可通过以下方式获得:
locale -a
【讨论】:
以上是关于如何从文件中删除所有变音符号?的主要内容,如果未能解决你的问题,请参考以下文章