使用sed刪除拼音的音調

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


有時候咱們對文檔過濾會有這樣的需求:正則表達式

  1. 篩選或刪除文檔中的不規則字符,好比中文字符。
  2. 把帶有音調的字母替換成沒有音調的普通字母,特別是拼音轉換。

例如,製做一個比較全的姓氏拼音字典。首先去網上找一個經常使用姓氏拼音表。我隨便找了一個: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

  1. 去掉漢字和其它與拼音無關的字符。
  2. 將音調替換成沒有音節的字母。
  3. 去掉重複的拼音。
  4. 排好序,每行一個。

假如上述文件存放在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

這樣就獲得了期待的結果。

相關文章
相關標籤/搜索