Linux

unix 中的模式匹配和擷取

  • December 31, 2014

我有一個這樣的文件:

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 $2where 替換正則表達式

    • $1並且$2是對擷取組的編號反向引用(...)。幾乎所有現代正則表達式引擎都支持這一點。
  • 關於正則表達式:

    • . = 任何字元,除了\n
    • .*= 一系列字元(在替換中忽略)
    • \d= 數字(與 相同[0-9]
    • \d+= 一個或多個\d

有關更詳細的說明,請參閱任何reg 表達式教程。

使用sed

sed 's/^.*\(miR-[0-9]*_microRNA\).*\(ENSG[0-9]*\).*$/\1\t\2/' <infile

引用自:https://unix.stackexchange.com/questions/176654