bash&shell系列文章:http://www.cnblogs.com/f-ck-need-u/p/7048359.html


有时候我们对文档过滤会有这样的需求:

  1. 筛选或删除文档中的不规则字符,比如中文字符。
  2. 把带有音调的字母替换成没有音调的普通字母,特别是拼音转换。

例如,制作一个比较全的姓氏拼音字典。首先去网上找一个常用姓氏拼音表。我随便找了一个:

百家姓全文(按拼音排序)  【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ú)
百家姓全文(按拼音排序)  农(nóng) 南门(nánmén) 南宫(nángōng)    【O】  欧(ōu) 欧阳(ōuyáng)  【P】  潘(pān) 庞(páng) 逄(páng) 裴(péi) 彭(péng) 蓬(péng) 皮(pí)  平(píng) 蒲(pú) 濮(pú) 浦(pǔ) 濮阳(púyáng)  【Q】  戚(qī) 齐(qí) 祁(qí) 乔(qiáo) 谯(qiáo) 强(qiáng) 屈(qū) 璩(qú) 瞿(qú) 钱(qián) 秦(qín) 钦(qīn) 琴(qín) 权(quán) 亓官(qínguān) 漆雕(qīdiāo) 邱(qiū) 秋(qiū) 裘(qiú) 仇(qiú) 曲(qū) 全(quán) 阙(quē)  【R】   冉(rǎn) 饶(ráo) 壤驷(rǎngsì) 任(rèn) 阮(ruǎn) 荣(róng) 容(róng) 芮(ruì) 戎(róng)  融(róng) 茹(rú) 汝(rǔ)  【S】  桑(sāng)  司(sī)  宋(sòng) 松(sōng) 舒(shū) 水(shuǐ) 苏(sū) 宿(sù) 孙(sūn) 索(suǒ)  沈(shěn)  沙(shā) 邵(shào) 施(shī) 师(shī) 石(shí) 史(shǐ) 时(shí) 厍(shè) 束(shù)  殳(shū)   盛(shèng)  单(shàn) 山(shān) 商(shāng) 尚(shàng) 双(shuāng) 韶(sháo)  莘(shēn)   申(shēn) 慎(shèn) 寿(shòu) 司马(sīmǎ) 上官(shàngguān) 申屠(shēntú)  司徒(sītú)   司空(sīkōng) 司寇(sīkòu) 生(shēng) 帅(shuài) 佘(shé) 赏(shǎng)  【T】 邰(tái) 谭(tán) 谈(tán) 陶(táo) 唐(táng) 汤(tāng) 滕(téng) 田(tián) 童(tóng)通(tōng) 佟(tóng) 钭(tǒu) 屠(tú) 涂(tú) 太叔(tàishū) 澹台(tántái) 拓跋(tuòbá)    【W】 万(wàn) 邬(wū) 巫(wū) 乌(wū) 吴(wú) 伍(wǔ) 武(wǔ) 汪(wāng) 王(wáng)  危(wēi) 微(wēi) 韦(wéi) 卫(wèi) 魏(wèi) 蔚(wèi) 温(wēn) 闻(wén) 文(wén) 翁(wēng) 沃(wò) 闻人(wénrén) 巫马(wūmǎ)  【X】  奚(xī) 郗(xī) 席(xí) 习(xí) 郤(xì) 夏(xià) 萧(xiāo) 咸(xián)   宣(xuān)  熊(xióng)   项(xiàng) 须(xū) 胥(xū) 徐(xú) 许(xǔ)   薛(xuē) 荀(xún) 谢(xiè) 解(xiè) 辛(xīn)    邢(xíng) 幸(xìng) )   向(xiàng) 相(xiàng) 夏侯(xiàhóu) 轩辕(xuānyuán) 鲜于(xiānyú) 西门(xīmén)  【Y】  燕(yān) 鄢(yān) 颜(yán) 言(yán) 闫(yán) 阎(yán) 严(yán)晏(yàn) 姚(yáo) 羊(yáng)  杨(yáng) 阳(yáng) 养(yǎng) 仰(yǎng) 叶(yè) 云(yún) 俞(yú) 袁(yuán) 於(yū) 于(yú) 鱼(yú) 虞(yú) 余(yú) 庾(yǔ) 禹(yǔ) 郁(yù) 喻(yù) 鬱(yù) 乐(yuè) 岳(yuè)    越(yuè) 元(yuán) 伊(yī) 易(yì) 羿(yì) 益(yì) 阴(yīn) 殷(yīn)尹(yǐn)印(yìn) 应(yīng)  尤(yóu) 游(yóu) 有(yǒu) 雍(yōng)   尉迟(yùchí) 宇文(yǔwén) 乐正(yuèzhèng) 羊舌(yángshé)  【Z】  宰(zǎi) 昝(zǎn) 查(zhā) 翟(zhái) 詹(zhān) 湛(zhàn) 张(zhāng) 章(zhāng) 赵(zhào)  訾(zǐ) 支(zhī) 甄(zhēn) 曾(zēng) 周(zhōu) 邹(zōu) 郑(zhèng) 朱(zhū) 诸(zhū) 竺(zhú) 祝(zhù) 臧(zāng)  宗(zōng) 钟(zhōng) 终(zhōng) 仲(zhòng) 祖(zǔ) 左(zuǒ) 卓(zhuó) 庄(zhuāng) 诸葛(zhūgě) 宗政(zōngzhèng) 仲孙(zhòngsūn) 钟离(zhōnglí)   长孙(zhǎngsūn) 仉督(zhǎngdū) 子车(zǐjū) 颛孙(zhuānsūn) 宰父(zǎifǔ) 左丘(zuǒqiū)

通常网上找到的都是些包含音调的字符序列。我们的主要目的包括:

  1. 去掉汉字和其它与拼音无关的字符。
  2. 将音调替换成没有音节的字母。
  3. 去掉重复的拼音。
  4. 排好序,每行一个。

假如上述文件存放在yindiao.txt中。

(1).去掉非拼音相关的字符,只保留拼音字母,并存放到yindiao1.txt文件中。

cat yindiao.txt | tr -s ' ' '\n' | sed -r -n "s/([^a-z])//pg" >yindiao1.txt

将得到如下格式的内容:

xíng
xìngxiàng
xiàng
xiàhóu
xuānyuán
xiānyú
xīményān
yān
yán
yán
yán
yán
yányàn
yáo
yáng
yáng
yáng

(2).将带音节的字母替换。

如何处理音节,可能很多人不知道,但仔细阅读过正则表达式语法说明的人想必都知道如何表示。

在正则表达式中,使用[=a=]来表示字母a的各种音节,即āáǎà。其实这不是正则中的语法,而是一种类,它称为等价类

常见的类集还有:

  • 字符类:如[:alpha:][:alnum:]......;
  • 排序类:如[.ab.],排序类明确表示其内字符是一个整体,例如这里的例子表示只能匹配"ab",不能匹配a或b或ba。

回归正题,现在就可以将带有音节的字符进行替换了。

由于26个字母,每个字母都有4个音节,光是音节字符就共有26*4=104个。所以,想要替换文件中的所有音节字符,考虑使用循环。

for i in {a..z};dosed -i -r "s/[[="$i"=]]/"$i"/g" yindiao1.txt
done

如果不知道sed中的引号为什么这样用,见sed修炼系列(四):sed中的疑难杂症。

注意,这里sed必须使用"-i"选项,不能重定向,因为每次循环都只改变一个字母的音节,每次重定向到文件中显然不合适。

至此,得到了下面没有音节的拼音。最后剩下排序和去重。

xu
xu
xu
xu
xue
xun
xie
xie
xin
xing
xingxiang
xiang
xiahou

(3).排序、去重。

sort yindiao1.txt | uniq -u > yindiao.txt

这样就得到了期待的结果。

使用sed删除拼音的音调相关推荐

  1. linux sed删除文件最后一行及shell中单引号、双引号的区别

    zxl@fedora DMCCA]$ echo hello >hello [zxl@fedora DMCCA]$ [zxl@fedora DMCCA]$ [zxl@fedora DMCCA]$ ...

  2. sed 删除某一行_sed删除指定行

    待处理文本如1-8行文本 $cata1 2 3 4 5 6 7 8 sed删除连续指定行:如1-4行 $sed '1,4d'a5 6 7 8 sed删除不连续指定行:如第一行和第三行 $sed -e ...

  3. 用sed删除匹配到字符串的行

    用sed删除匹配到字符串的行: 语法:sed-i'/关键字符/d'文件名 举例1:匹配"\etc\install.sh" set -i '/\/etc\/install.sh/d' ...

  4. sed 删除/增加文件的某一行

    sed 删除/增加文件的某一行: sed -i '6d' file.txt, 删除的是第6行的内容 1.删除文档的第一行 sed -i '1d' file.txt 2.删除文档的最后一行 sed -i ...

  5. sed删除匹配行的上一行和下一行

    1.删除匹配行的上一行和下一行: sed -i -e '/string/{n;d}' -e '$!N;/\n.*string/!P;D' file 2.sed中使用变量,删除匹配行的上一行和下一行: ...

  6. Linux应用之sed删除空行

    文章目录 一.sed编辑器介绍 二.sed删除空白行 1. 删除连续的空白行 2. 删除开头的空白行 3. 删除结尾的空白行 4. 删除HTML标签 一.sed编辑器介绍 sed编辑器被称作流编辑器( ...

  7. 【linux】使用sed删除大文件中的指定行

    [linux]使用sed删除大文件中的指定行 引言: 最近在清洗数据时遇到一个超大的文件,需要删除其中不符合数据要求的指定行.使用之前写好的python脚本清洗速度太慢,于是检索了许多linux文件处 ...

  8. 使用sed删除或操作两个pattern模式匹配行之间的内容

    使用sed删除两个模式匹配行之间的内容 在配置文件中有时候想要把两节之间的内容全部删除,便于修改为新的配置,sed命令如下 //删除模式匹配行之间的内容 sed -i '/\[section1\]/, ...

  9. linux shell sed 删除文件 前几行

    sed命令 不加参数i 就只看到结果,没写入a.txt文件,加 参数i 就写入了 如果有不大确定删除效果的,就先不加 参数i 1,删除首行 $ sed -i '1d' a.txt 2,删除前100行 ...

最新文章

  1. CentOS6.9 ARM虚拟机扩容系统磁盘
  2. 计算机上的应用商城,Windows 应用商店帐户将应用安装在多达五台电脑上
  3. 虚拟机备份oracle异常,客户端连接虚拟机Oracle服务器异常
  4. 【NLP】中文情感分类单标签
  5. 阿里巴巴的独立环境是如何实现的
  6. Kafka刚开启就秒退
  7. Rainmeter后续——WIN10任务栏透明以及设置开机启动应用
  8. ASP.NET MVC的最佳日志记录库
  9. php 微信扫码给红包,关于现金红包的详细介绍
  10. JavaScript 基础--- (正则表达式 / 事件监听与绑定)
  11. ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8;
  12. 斯坦福NLP名课带学详解 | CS224n 第5讲 - 句法分析与依存解析(NLP通关指南·完结)
  13. HDU 1166 敌兵布阵 线段树 单点修改 区间查询
  14. 计算机导论王玉龙,计算机导论王玉龙
  15. 如何保养可让自己年轻10岁?/经常熬夜的人要怎样保养自己的身体?
  16. 常用英语命令(音标,释义)
  17. 2022-09-17青少年软件编程(C语言)等级考试试卷(四级)解析
  18. 20155210 2016-2017-2 《Java程序设计》第7周学习总结
  19. 广东b级计算机考试试题,计算机等级考试级B考试试题真题试卷.doc
  20. 如何使用闲置的云服务器搭建一个属于自己的私人云网盘(可道云kodbox)

热门文章

  1. 实时监测网络是否断线的几种办法(转coolend)
  2. 第一批吃螃蟹的人:浙大全日制英文MBA复试经验分享
  3. python3列表学习
  4. 科通芯城康敬伟:不照抄别人美国也没这模式
  5. 影响中国管理的10大商业模式
  6. react-ga组件的简单应用笔记
  7. Shop项目--12. 显示用户订单列表order_list.jsp
  8. 能做到云中分钟级数据恢复 爱数灾备云据说能引领行业10年
  9. 决策树算法:用户分层:
  10. ExtJs 树的右击菜