Linux
unix 中的模式匹配和擷取
我有一個這樣的文件:
A1-1915435_1_MIMAT0000069_MirBase_miR-16_microRNA_1_22-A1-1915435_1_ENSG00000206737_ENST00000384010_U1_snRNA_73_115 A1-2362643_1_MIMAT0000732_MirBase_miR-378_microRNA_1_21-A1-2362643_1_ENSG00000222328_ENST00000410396_U2_snRNA_168_211
我想要一個輸出,其中我將 micro RNA 部分和 ENSG 部分選項卡分開。像這樣的一些事情:
miR-16_microRNA ENSG00000206737 miR-378_microRNA ENSG00000222328
我可以為它編寫一個 perl 腳本,但我想必須有使用 awk、sed perl 等的命令行解決方案。
perl -pe 's!.*(miR-\d+_microRNA).*(ENSG\d+).*!$1\t$2!'
解釋一下?
當然,對不起:
對於每一行(perl -p)
用
$1 tab $2
where 替換正則表達式
$1
並且$2
是對擷取組的編號反向引用(...)
。幾乎所有現代正則表達式引擎都支持這一點。關於正則表達式:
.
= 任何字元,除了\n
.*
= 一系列字元(在替換中忽略)\d
= 數字(與 相同[0-9]
)\d+
= 一個或多個\d
有關更詳細的說明,請參閱任何reg 表達式教程。
使用
sed
:sed 's/^.*\(miR-[0-9]*_microRNA\).*\(ENSG[0-9]*\).*$/\1\t\2/' <infile