如何在grep和sed命令中使用擴展的正則表達式

對於grep,可以使用egrep命令來替代,那麼就支持擴展的正則表達式了。

對於sed,只要加上參數-r就可以支持擴展的正則表達式了。

由於平時寫python用的正則表達式大部分都是擴展的正則表達式,所以,出於習慣,我喜歡更自由的擴展的正則表達式,使用起來不用去考慮是否支持的問題。


以下是使用的例子,假設有一堆文件,內容都是諸如:

snme0001 今天心情不錯!

stta0001 明天是週五。

seef0001 能把你的IPAD借給我玩玩嗎?


我們想把這些文件中不含有英文的句子合併到一個大文件中,我使用如下命令:

egrep '[[:alpha:]]{4}[[:digit:]]{4}' $'\t' * | cut -d ":" -f2 | sed -e 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/' - | sed -r -e '/\t.*[a-zA-Z]/!w ../M1.txt'


1. 首先把這些文件中符合句子ID格式的句子都抓出來。對於tab,egrep沒有特別好的方法來匹配,必須用$'\t'來表示,而且由於$是個特殊符號,所以得把tab專門抽出來,而不能和其他的字符或者模式放到一個模式裏。另外,*表示當前文件夾下的所有文件。

2. 抓取ID和句子。之所以用cut,因爲egrep抓出來的句子的前邊有文件名和冒號。所以,正好用cut,獲取以冒號來分割的第二部分。

3. 由於有些句子的ID是大寫字母,這裏要全部轉爲小寫字母。tr命令這裏實在是不好用,因爲它只能對文件進行處理。又不太會用awk,所以就用了sed的這個替換功能。y表示替換命令,然後要替換字符對前後來寫,所以ABCD..和abcd的數目要相同。

4. 這裏用到了!,這個表示符號條件的就不執行命令,不符合的才執行。也就是說,凡是在tab後出現了英文字母的句子,就不寫到某個文件內。在sed裏,是可以用\t來表示tab的,比較好。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章