在使用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'