sed 定位不匹配的行

在使用sed进行文本处理的时候,有些情况下需要对不满足模式要求的行进行处理。sed是具有这个功能的。

首先,要明白sed的命令包含两个部分,一个部分是地址,一个部分是操作。例如,对于从UniProt下载的FASTA文件,如果想先把注释行变成只有AC的行,就需要这么做:

sed -re '/^>/ s/^>S+|(S+)|.*$/>1/g'

-re选项的含义是使用GNU正则表达式扩展,这样才可以在命令行里面使用例如S+这样的转义序列,如果不使用-re选项,那么就需要写成“S+”才能识别。

替换部分的含义是要开头是“>”然后是几个可打印字符,然后是两个“|”中间有若干可打印字符,然后是随便什么字符直到结束。我们需要的AC编号就在两个“|”中间。所以要把这里的S+用括号括起来,备用为反向引用。然后在替换部分使用“1”,来引用这个匹配部分。

那么,我们知道有20种标准的氨基酸,而BJOUXZ这6个字母都有可能出现在序列中,如果我们还想把序列里面的这些非标准符号都替换成“*”,那么怎么办呢。这就需要进行不匹配的行的操作,sed 的文档里面很明确的写道如下的内容:

“After the address (or address-range), and before the command, a !  may be inserted, which specifies that the command shall only be executed if the address (or address-range) does not match.”

所以,要想匹配那些序列行,并且去掉非标准符号,只要使用如下的命令就好了

sed -re '/^>/ ! s/[BJOUXZ]/*/g'
此条目发表在生物信息学, 软件使用与程序设计分类目录。将固定链接加入收藏夹。