Linux 如何使用bash从大文件中提取以特定字符开头的所有单词?

Linux 如何使用bash从大文件中提取以特定字符开头的所有单词?,linux,bash,sed,Linux,Bash,Sed,我有一个非常大的文件,看起来像这样: ENST00000629289"; transcript_version "2"; exon_number "22"; gene_name "CDK11B"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "CDK11B-208"; transcript_source "ensembl"; transcript_biotype "protein_cod

我有一个非常大的文件,看起来像这样:

ENST00000629289"; transcript_version "2"; exon_number "22"; gene_name "CDK11B"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "CDK11B-208"; transcript_source "ensembl"; transcript_biotype "protein_coding"; exon_id "ENSE00001594002"; exon_version "1"; tag "basic"; transcript_support_level "5";
ENST00000629289"; transcript_version "2"; exon_number "22"; gene_name "CDK11B"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "CDK11B-208"; transcript_source "ensembl"; transcript_biotype "protein_coding"; exon_id "ENSE00001594002"; exon_version "1"; tag "basic"; transcript_support_level "5";
ENST00000629289"; transcript_version "2"; exon_number "22"; gene_name "CDK11B"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "CDK11B-208"; transcript_source "ensembl"; transcript_biotype "protein_coding"; protein_id "ENSP00000485937"; protein_version "1"; tag "basic"; transcript_support_level "5";
我想提取所有仅以特定字符ENST开头的单词 我尝试了以下命令:

 sed 's/.*\(ENST.*transcript_version\)/\1/p'
但它会打印出所有的行。 有人能帮我吗?

使用grep和-o选项只打印匹配的部分:

grep -Po '^ENST.*transcript_version' file
使用sed


注意,-E选项启用扩展正则表达式,如果不支持,请改用-r选项。另外,我觉得最优雅的解决方案是。

您似乎对sed解决方案感兴趣,或者您可能因为某些不寻常的原因需要一个sed解决方案。 否则,我建议使用grep解决方案,例如,此处其他答案提供的类似解决方案。可能不容易检查是否有成绩单,但无法打印,我相信您的描述意味着这一点,尽管您的代码不同。至少没有greps-P选项;例如,在我的grep中不可用。或者使用perl或awk

为了:

仅从匹配的行打印,使用-n 仅打印ENST0000629289;抄本版本,最后使用另一个。* 不打印;如果不确定您是否真的想要,请移动\ 仅打印ENST*使用更紧的正则表达式[[:alnum:][]*\.**************************************************************************************** 代码:

输出:

ENST00000629289
ENST00000629289
ENST00000629289
代码2用于包含成绩单,如果您需要:

sed -n 's/.*\(ENST[[:alnum:]]*.*transcript_version\).*/\1/p'
产出2:

ENST00000629289"; transcript_version
ENST00000629289"; transcript_version
ENST00000629289"; transcript_version
我的sed:
GNU sed版本4.2.1

预期的输出是什么?添加到@sjam的评论中:您的sed尝试表明,您不只是想提取第一个单词,而是从行的开头到转录本版本的所有内容。请通过直接更新您的问题来澄清。做得很好。虽然-P可以很好地与Linux上的GNU grep配合使用,但这里不需要它-在这种情况下只需-o就可以了,这将使命令也可以在BSD/macOS上工作。好的,谢谢您的建议。但我之所以提到-P选项,是因为perl正则表达式将更加强大@解释grep只是sed的一个子集也很有用。基本上,sed是grep的大哥:@DavidC.Rankin:将grep称为sed的子集可能会产生误导,因为它们的语法不兼容。按照同样的松散逻辑,grep是awk的一个子集。
sed -n 's/.*\(ENST[[:alnum:]]*.*transcript_version\).*/\1/p'
ENST00000629289"; transcript_version
ENST00000629289"; transcript_version
ENST00000629289"; transcript_version