bash&shell系列文章:http://www.cnblogs.com/f-ck-need-u/p/7048359.htmlhtml
有時候咱們對文檔過濾會有這樣的需求:正則表達式
例如,製做一個比較全的姓氏拼音字典。首先去網上找一個經常使用姓氏拼音表。我隨便找了一個:shell
百家姓全文(按拼音排序) 【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ū)
一般網上找到的都是些包含音調的字符序列。咱們的主要目的包括:bash
假如上述文件存放在yindiao.txt中。spa
(1).去掉非拼音相關的字符,只保留拼音字母,並存放到yindiao1.txt文件中。code
cat yindiao.txt | tr -s ' ' '\n' | sed -r -n "s/([^a-z])//pg" >yindiao1.txt
將獲得以下格式的內容:htm
xíng xìng xiàng xiàng xiàhóu xuānyuán xiānyú xīmén yān yān yán yán yán yán yányàn yáo yáng yáng yáng
(2).將帶音節的字母替換。blog
如何處理音節,可能不少人不知道,但仔細閱讀過正則表達式語法說明的人想必都知道如何表示。排序
在正則表達式中,使用[=a=]
來表示字母a的各類音節,即āáǎà
。其實這不是正則中的語法,而是一種類,它稱爲等價類。文檔
常見的類集還有:
[:alpha:]
、[:alnum:]
......;[.ab.]
,排序類明確表示其內字符是一個總體,例如這裏的例子表示只能匹配"ab",不能匹配a或b或ba。迴歸正題,如今就能夠將帶有音節的字符進行替換了。
因爲26個字母,每一個字母都有4個音節,光是音節字符就共有26*4=104個。因此,想要替換文件中的全部音節字符,考慮使用循環。
for i in {a..z};do
sed -i -r "s/[[="$i"=]]/"$i"/g" yindiao1.txt
done
若是不知道sed中的引號爲何這樣用,見sed修煉系列(四):sed中的疑難雜症。
注意,這裏sed必須使用"-i"選項,不能重定向,由於每次循環都只改變一個字母的音節,每次重定向到文件中顯然不合適。
至此,獲得了下面沒有音節的拼音。最後剩下排序和去重。
xu
xu
xu
xu
xue
xun
xie
xie
xin
xing
xing
xiang
xiang
xiahou
(3).排序、去重。
sort yindiao1.txt | uniq -u > yindiao.txt
這樣就獲得了期待的結果。