如何在grep和sed命令中使用擴(kuò)展的正則表達(dá)式
對(duì)于grep,可以使用egrep命令來替代,那么就支持?jǐn)U展的正則表達(dá)式了。
對(duì)于sed,只要加上參數(shù)-r就可以支持?jǐn)U展的正則表達(dá)式了。
以下是使用的例子,假設(shè)有一堆文件,內(nèi)容都是諸如:
snme0001 今天心情不錯(cuò)!
stta0001 明天是周五。
seef0001 能把你的IPAD借給我玩玩嗎?
我們想把這些文件中不含有英文的句子合并到一個(gè)大文件中,我使用如下命令:
egrep '[[:alpha:]]{4}[[:digit:]]{4}' $' ' * | cut -d ":" -f2 | sed -e 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/' - | sed -r -e '/ .*[a-zA-Z]/!w ../M1.txt'
1. 首先把這些文件中符合句子ID格式的句子都抓出來。對(duì)于tab,egrep沒有特別好的方法來匹配,必須用$' '來表示,而且由于$是個(gè)特殊符號(hào),所以得把tab專門抽出來,而不能和其他的字符或者模式放到一個(gè)模式里。另外,*表示當(dāng)前文件夾下的所有文件。
2. 抓取ID和句子。之所以用cut,因?yàn)閑grep抓出來的句子的前邊有文件名和冒號(hào)。所以,正好用cut,獲取以冒號(hào)來分割的第二部分。
3. 由于有些句子的ID是大寫字母,這里要全部轉(zhuǎn)為小寫字母。tr命令這里實(shí)在是不好用,因?yàn)樗荒軐?duì)文件進(jìn)行處理。又不太會(huì)用awk,所以就用了sed的這個(gè)替換功能。y表示替換命令,然后要替換字符對(duì)前后來寫,所以ABCD..和abcd的數(shù)目要相同。
4. 這里用到了!,這個(gè)表示符號(hào)條件的就不執(zhí)行命令,不符合的才執(zhí)行。也就是說,凡是在tab后出現(xiàn)了英文字母的句子,就不寫到某個(gè)文件內(nèi)。在sed里,是可以用 來表示tab的,比較好。