sed删除拼音的音调
Linux基础系列文章大纲
Shell系列和sed系列文章大纲
sed删除拼音的音调
有时候我们对文档过滤会有这样的需求:
- 筛选或删除文档中的不规则字符,特别是中文字符。
- 把带有音调的字母替换成没有音调的普通字母,特别是拼音转换。
例如,制作一个比较全的姓氏拼音字典。首先去网上找一个常用姓氏拼音表。我随便找了一个:
1 | 百家姓全文(按拼音排序) 【A】 安(ān) 敖(áo) 艾(ài) 爱(ài) 【B】 巴(bā)白(bái) 鲍(bào) 包(bāo) 暴(bào) 班(bān) 柏(bǎi) 毕(bì) 卞(biàn) 边(biān) 薄(bó) 伯(bó) 卜(bǔ) 步(bù) 贝(bèi) 贲(bēn) 邴(bǐng) 别(bié) 百里(bǎilǐ) 【C】 蔡(cài) 岑(cén) 曹(cáo) 陈(chén) 程(chéng) 褚(chǔ) 昌(chāng) 常(cháng) 成(chéng) 崔(cuī) 储(chǔ) 车(chē) 池(chí) 从(cóng) 苍(cāng) 柴(chái) 充(chōng) 晁(cháo) 巢(cháo) 淳于(chúnyú) 单于(chányú) 楚(chǔ) 【D】 笪(dá) 戴(dài) 狄(dí) 窦(dòu) 东(dōng) 董(dǒng) 杜(dù) 刁(diāo) 丁(dīng) 邓(dèng) 段(duàn) 党(dǎng) 堵(dǔ) 都(dū) 东方(dōngfāng) 端木(duānmù) 段干(duàngān) 东郭(dōngguō) 东门(dōngmén) 第五(dìwǔ) 【E】 鄂(è) 【F】 法(fǎ) 费(fèi) 范(fàn) 樊(fán) 方(fāng) 房(fáng) 丰(fēng) 封(fēng) 酆(fēng) 冯(féng) 费(fèi) 房(fáng) 傅(fù) 伏(fú) 符(fú) 福(fú) 扶(fú) 富(fù) 【G】 盖(gài) 甘(gān) 干(gān) 高(gāo) 郜(gào) 戈(gē) 葛(gě) 耿(gěng) 谷(gǔ) 古(gǔ) 顾(gù) 郭(guō) 国(guó) 归(guī) 桂(guì) 勾(gōu) 缑(gōu) 关(guān) 管(guǎn) 广(guǎng) 公(gōng) 弓(gōng) 龚(gōng) 宫(gōng) 巩(gǒng) 贡(gòng) 公孙(gōngsūn) 公西(gōngxī) 公羊(gōngyáng) 公冶(gōngyě) 公良(gōngliáng) 榖梁(gǔliáng) 【H】 哈(hǎ) 海(hǎi) 郝(hǎo) 韩(hán) 杭(háng) 何(hé) 和(hé) 贺(hè) 衡(héng) 花(huā) 滑(huá) 桓(huán) 怀(huái) 胡(hú) 扈(hù) 惠(huì) 华(huà) 宦(huàn) 黄(huáng) 侯(hóu) 后(hòu) 洪(hóng) 弘(hóng) 红(hóng) 霍(huò) 赫连(hèlián) 皇甫(huángpǔ) 呼延(hūyán) 【J】 嵇(jī) 姬(jī) 吉(jí) 汲(jí) 籍(jí) 季(jì) 计(jì) 纪(jì) 蓟(jì) 冀(jì) 暨(jì) 金(jīn) 靳(jìn) 家(jiā) 郏(jiá) 贾(jiǎ) 简(jiǎn) 焦(jiāo) 姜(jiāng) 江(jiāng) 蒋(jiǎng) 晋(jìn) 经(jīng) 荆(jīng) 井(jǐng) 景(jǐng) 鞠(jū) 居(jū) 夹谷(jiágǔ) 【K】 寇(kòu) 孔(kǒng) 康(kāng) 柯(kē) 蒯(kuǎi) 隗(kuí) 夔(kuí) 匡(kuāng) 阚(kàn) 空(kōng) 亢(kàng) 况(kuàng) 【L】 李(lǐ) 郎(láng) 鲁(lǔ) 柳(liǔ) 雷(léi) 蓝(lán) 路(lù) 娄(lóu) 林(lín) 栾(luán) 厉(lì) 刘(liú) 柳(liǔ) 黎(lí) 吕(lǚ) 梁(liáng) 廉(lián) 鲁(lǔ) 骆(luò) 罗(luó) 凌(líng) 卢(lú) 陆(lù) 栾(luán) 龙(lóng) 赖(lài) 劳(láo) 郦(lì) 蔺(lìn) 连(lián) 廖(liào) 禄(lù) 利(lì) 隆(lóng) 冷(lěng) 逯(lù) 令狐(lìnghú) 闾丘(lǘqiū) 梁丘(liángqiū) 【M】 马(mǎ) 满(mǎn) 苗(miáo) 母(mǔ) 穆(mù) 毛(máo) 明(míng) 茅(máo) 麻(má) 蒙(méng) 孟(mèng) 糜(mí) 米(mǐ) 宓(mì) 梅(méi) 莫(mò) 墨(mò) 牟(móu) 缪(miào) 牧(mù) 慕(mù) 闵(mǐn) 俟(mòqí) 慕容(mùróng) 【N】 那(nā) 能(nài) 佴(nài) 倪(ní) 年(nián) 宁(nìng) 乜(niè) 聂(niè) 钮(niǔ) 牛(niú) |
通常网上找到的都是些包含音调的字符序列。我们的主要目的包括:
- 去掉汉字和其它与拼音无关的字符。
- 将音调替换成没有音节的字母。
- 去掉重复的拼音。
- 排好序,每行一个。
假如上述文件存放在yindiao.txt中。
(1).去掉非拼音相关的字符,只保留拼音字母,并存放到yindiao1.txt文件中。
1 | cat yindiao.txt | tr -s ' ' '\n' | sed -r -n "s/([^a-z])//pg" >yindiao1.txt |
将得到如下格式的内容:
1 | xíng |
(2).将带音节的字母替换。
如何处理音节,可能很多人不知道,但仔细阅读过正则表达式语法说明的人想必都知道如何表示。
在正则表达式中,使用[=a=]
来表示字母a的各种音节,即āáǎà
。其实这不是正则中的语法,而是一种类,它称为等价类。
常见的类集还有:
- 字符类:如
[:alpha:]
、[:alnum:]
……; - 排序类:如
[.ab.]
,排序类明确表示其内字符是一个整体,例如这里的例子表示只能匹配”ab”,不能匹配a或b或ba。
回归正题,现在就可以将带有音节的字符进行替换了。
由于26个字母,每个字母都有4个音节,光是音节字符就共有26*4=104
个。所以,想要替换文件中的所有音节字符,考虑使用循环。
1 | for i in {a..z};do |
如果不知道sed中的引号为什么这样用,见sed修炼系列(四):sed中的疑难杂症。
注意,这里sed必须使用”-i”选项,不能重定向,因为每次循环都只改变一个字母的音节,每次重定向到文件中显然不合适。
至此,得到了下面没有音节的拼音。最后剩下排序和去重。
1 | xu |
(3).排序、去重。
1 | sort yindiao1.txt | uniq -u > yindiao.txt |
这样就得到了期待的结果。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 骏马金龙!
评论