如何在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的,比较好。

你可能感兴趣的:(linux,grep,sed)