119-正则表达式复习

刘小泽写于19.5.27 小伙伴们可能发现了,我已经好几天没有更新了,这并不符合我的习惯,只是因为,完成了一件人生中的大事——硕士答辩。准备时间很短(因为真的不想花费太多时间在上面),但是结果还不错,顺利通过,很是开心。接下来,我会将之前拉下的进程补回来!🤓

简介

利用linux的单行命令,肯定少不了sed、awk操作,这次来看看它们怎么结合正则表达式,顺便再复习下相关的知识

正则表达式简写为regex,全称是regular expression,因此以后见到这个词,就知道代表的意思了。我们为什么会用到正则表达式,是因为这个可以作为文本过滤的准则,方便进行批处理。并且它无处不在,在编程语言(Java、Perl、Python等)或者linux命令(sed、awk、grep等)都有体现。

首先举个简单的例子:现在我有这个序列,但是每个fa的命名都是中文,我不想要,只保留id就好了,看下前后对比

如果有100条序列都有括号,并且括号中是中文,那么去掉括号中的内容可以一键完成:cat test.fa| sed 's/(.*)//'

正则表达式的类型

Linux中有两种正则表达式的形式:标准版 Basic Regular Expression (BRE) 以及扩展版Extended Regular Expression (ERE) 。大多的linux基础命令支持BRE,但是ERE就是和一些编程语言搭配使用,提供了更多的匹配项,比如可以匹配数字、单词等,像awk就是典型的ERE模式,但是它和sed都可以向下兼容BRE模式

最简单的匹配

比如:

echo "Testing regex using sed" | sed -n '/regex/p'
echo "Testing regex using awk" | awk '/regex/{print $0}'

得到的结果都是这句话。这里可以看到,正则表达式并不关心匹配的字段出现的位置以及出现了多少次,从头到尾扫一遍,一行中只要有就输出。

但是,匹配也需要注意:它分字母大小写,例如:

echo "Welcome to Bioinfoplanet" | awk '/bioinfo/{print $0}' # 不返回内容
echo "Welcome to bioinfoplanet" | awk '/bioinfo/{print $0}' # 返回这句话

另外,在匹配模式中,可以加入空格、数字等等

echo "Testing regex 2 again" | awk '/regex 2/{print $0}'

特殊字符

https://www.threesl.com/blog/special-characters-regular-expressions-escape/

例如:

1. Finished\? 匹配 Finished?
2. ^http 匹配 以http开头的
3. [^0-9] 匹配 除了0-9的其他字符 
# 参考:http://www.robelle.com/smugbook/regexpr.html
4. ing$ 匹配结尾 像exciting这样的,而不是ingenious这样的
5. gr.y 匹配 gray grey等等
6. Red|Yellow 匹配 Red或者Yellow
7. colou?r 匹配 colour或color
8. Ah? 匹配 A或Ah
9. Ah* 匹配 Ahhhhh或A
10. Ah+ 匹配 Ah、Ahhh,但不匹配A
11. [cbf]ar 匹配 car、bar、far
12. [a-zA-Z] 匹配 a-z全部大小写
13. {}中的数字表示前一个字符出现多少次,可以是一个数字表示精确次数,也可以是用逗号隔开的两个数字表示出现次数范围

如果要匹配特殊字符,就需要转义,也就是加\ ,例如:

# 要匹配这里的\
echo "\ is a special character" | awk '/\\/{print $0}'

看到这里说明你对正则比较感兴趣,但是有没有注意到一个问题? 上面第一张图的例子我们使用的是sed 's/(.*)//' 这个命令,但是学习了特殊字符以后,发现()都是特殊字符,按说应该加转义去进行匹配的,这里没有加就可以成功,反而,加了转义符就报错。

那么,是不是上面特殊字符这部分错了? 我搜索了一下,在这里找到了解答:https://stackoverflow.com/questions/6387907/whether-to-escape-and-in-regex-using-gnu-sed

原来,使用的sed还有两种版本,gnu与bsd 。但这里的规定还是比较混乱的,至于到底用不用转义:首先如果在ERE模式下,需要转义;普通模式下先不转义试试看

第一张图的例子也可以这么做:cat test.fa| sed -r 's/\(.*\)//'

定位符

包括^(定位起点) 与 $(定位终点)

定位空行就是:/^$/,于是过滤空行就是:

awk '!/^$/{print $0}' my_file

删除注释行:

sed -e '/^#/ d' my_file
Yunze Liu
Yunze Liu
Bioinformatics Sharer

Co-founder of Bioinfoplanet(生信星球)

Next
Previous

Related