對於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的,比較好。