unix 中的模式匹配和捕获

use*_*373 3 linux sed awk perl regular-expression

我有一个这样的文件:

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
Run Code Online (Sandbox Code Playgroud)

我想要一个输出,其中我将 micro RNA 部分和 ENSG 部分选项卡分开。像这样的事情:

miR-16_microRNA ENSG00000206737
miR-378_microRNA    ENSG00000222328
Run Code Online (Sandbox Code Playgroud)

我可以为它编写一个 perl 脚本,但我想必须有使用 awk、sed perl 等的命令行解决方案。

JJo*_*oao 6

perl -pe 's!.*(miR-\d+_microRNA).*(ENSG\d+).*!$1\t$2!'
Run Code Online (Sandbox Code Playgroud)

解释一下?

当然,对不起:

  • 对于每一行 (perl -p)
  • $1 tab $2where 替换正则表达式
    • $1$2编号为捕获组的反向引用(...)。几乎所有现代正则表达式引擎都支持这一点。
  • 关于正则表达式:
    • . = 任何字符,除了 \n
    • .* = 一个字符序列(在替换中被忽略)
    • \d= 数字(与 相同[0-9]
    • \d+ = 一个或多个 \d

请参阅任何reg 表达式教程以获得更详细的解释。