正则表达式复习
刘小泽写于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
欢迎关注我们的公众号~_~
我们是两个农转生信的小硕,打造生信星球,想让它成为一个不拽术语、通俗易懂的生信知识平台。需要帮助或提出意见请后台留言或发送邮件到jieandze1314@gmail.com