日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

使用 UNIX 進(jìn)行文本處理( 三 )


在清單 7 中,您可以看到 sed 命令的基本格式 。模式是用來(lái)匹配輸入(通常可以使用管道從另一個(gè)程序輸入,或者重定向于文本文件)的正則表達(dá)式,替換是指插入某些文本并用其代替那些與模式相匹配的文本 。標(biāo)志是用來(lái)控制替換行為的單個(gè)字符 。最常用的標(biāo)志是 g(將替換應(yīng)用于所有匹配模式的非重疊實(shí)例,而不僅僅是第一個(gè)匹配項(xiàng)) 。
實(shí)際上,模式和替換可以是各種各樣的內(nèi)容,并且它們之間不需要像在 tr 命令中那樣具有 1:1 的關(guān)系 。
清單 7. sed 命令
sed -e s/pattern/replacement/flags
最簡(jiǎn)單的模式是一個(gè)或多個(gè)字符組成的字符串 。如清單 8 所示,例如將單詞 one 替換為單詞 another 。
清單 8. 最簡(jiǎn)單的正則表達(dá)式
chrish@dhcp3 [334]$ echo "Replace one Word" | sed -e s/one/another/
Replace another word
可以使用方括號(hào)將一個(gè)或多個(gè)字符括起來(lái),以創(chuàng)建一個(gè)集合,該集合中的任何字符都可以匹配 。如清單 9 所示,讓我們將所有的元音字母替換為下劃線 。
清單 9. 匹配集合中的任何字符
chrish@dhcp3 [338]$ echo "This is a test" | sed -e s/[aeiouy]/_/g
Th_s _s _ t_st
請(qǐng)注意,示例中使用了 g 標(biāo)志,以便將模式/替換應(yīng)用于所有的匹配項(xiàng),而不僅僅是第一個(gè)匹配項(xiàng) 。
sed 命令也可以理解 tr 命令所支持的那些命名字符類,POSIX 對(duì)這些字符類進(jìn)行了定義,但是本文中的語(yǔ)法稍有不同 。清單 10 顯示了如何替換任何空白字符(制表符、空格等等):
清單 10. 根據(jù)命名字符類匹配內(nèi)容
chrish@dhcp3 [345]$ echo -e 'hellothere' 
hellothere
chrish@dhcp3 [346]$ echo -e 'hellothere' | sed -e 's/[[:space:]]/, /'
hello, there
echo 命令的 -e 標(biāo)志用來(lái)告訴該命令擴(kuò)展 C 風(fēng)格的轉(zhuǎn)義字符,在本示例中,它會(huì)把轉(zhuǎn)換為制表符 。
您還可以使用“.(點(diǎn)號(hào))匹配任何單個(gè)的字符 。如果您需要處理一些略有變化的數(shù)據(jù),或者包含難以進(jìn)行轉(zhuǎn)義的特殊字符的數(shù)據(jù),那么使用這個(gè)符號(hào)是非常方便的 。例如,在匹配引號(hào)時(shí),我經(jīng)常使用 .,所以我不需要在 Shell 中對(duì)引號(hào)進(jìn)行轉(zhuǎn)義 。清單 11 顯示了一個(gè)正則表達(dá)式初學(xué)者在使用這個(gè)模式時(shí)出現(xiàn)的問(wèn)題 。
清單 11. 這可能并不是想要的結(jié)果
chrish@dhcp3 [339]$ echo "This is a test" | sed -e s/./_/g
______________
既然您已經(jīng)了解了這些非?;镜膬?nèi)容,下面介紹一些附加模式修飾符,要使用高級(jí) 正則表達(dá)式,您現(xiàn)在還可以使用 -E 選項(xiàng)代替 -e 。? 字符表示匹配前面模式元素的零個(gè)或一個(gè)實(shí)例,* 字符表示匹配前面元素的零個(gè)或多個(gè)實(shí)例 。字符表示匹配一個(gè)或多個(gè)前面的元素 。^ 字符匹配行首,而 $ 則匹配行尾 。清單 12 顯示了實(shí)際應(yīng)用中的情況 。
清單 12. 實(shí)際應(yīng)用中的多個(gè)匹配項(xiàng)
chrish@dhcp3 [356]$ echo "hellooooo" | sed -E 's/o?$/_/g'
helloooo_
chrish@dhcp3 [357]$ echo "hellooooo" | sed -E 's/o*$/_/g'
hell_
chrish@dhcp3 [358]$ echo "hellooooo" | sed -E 's/o $/_/g'
hell_
如果使用圓括號(hào)將模式元素括起來(lái),您可以在替換字符串中使用匹配的內(nèi)容 。這些元素稱為組,它們使得正則表達(dá)式搜索和替換操作的功能變得非常強(qiáng)大,但是卻很難理解 。例如,在清單 13 中,您匹配一個(gè)或多個(gè) l (el) 字符,并且后面跟著零個(gè)或多個(gè) o 字符 。依次使用第二組和第一組中的內(nèi)容對(duì)其進(jìn)行替換,實(shí)際上是對(duì)它們進(jìn)行交換 。請(qǐng)注意這個(gè)模式中各個(gè)組的引用方法,即反斜杠加上該組的序號(hào) 。
清單 13. 匹配組
chrish@dhcp3 [361]$ echo "hellooooo" | sed -E 's/(l )(o*)$/21/g'
heoooooll
通過(guò)在大括號(hào)中指定匹配的數(shù)目,您可以匹配特定數(shù)目的模式 。例如,模式 o{2} 將匹配兩個(gè)(僅僅兩個(gè))o 字符 。

推薦閱讀