正则表达式复习

作者: 刘小泽 | 来源:发表于2019-05-27 21:31 被阅读44次

    刘小泽写于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

    Welcome to our bioinfoplanet!

    相关文章

      网友评论

        本文标题:正则表达式复习

        本文链接:https://www.haomeiwen.com/subject/sbgktctx.html