正则表达式捕获组在 regex101 中工作,而不是 sed

Regex capture group works in regex101, not sed

我发现了其他一些类似标题的问题,但没有找到答案。

我的文字是:

##bcftools_mergeCommand=merge --force-samples -m none -O v -o analysis/STUDY1/hg19/exome/merged.vcf --threads 4 analysis/STUDY1/hg19/exome/varscan_norm.vcf.gz analysis/STUDY1/hg19/exome/gatk_norm.vcf.gz analysis/STUDY1/hg19/exome/samtools_norm.vcf.gz analysis/STUDY1/hg19/exome/freebayes_norm.vcf.gz

我想要 .vcf.gz 文件的名称。

Sed 给我:

echo "##bcftools_mergeCommand=merge --force-samples -m none -O v -o analysis/STUDY1/hg19/exome/merged.vcf --threads 4 analysis/STUDY1/hg19/exome/varscan_norm.vcf.gz analysis/STUDY1/hg19/exome/gatk_norm.vcf.gz analysis/STUDY1/hg19/exome/samtools_norm.vcf.gz analysis/STUDY1/hg19/exome/freebayes_norm.vcf.gz" | sed -En 's/\/([^\/]+\.vcf\.gz)//g'

结果为空白。

Regex101 给出:

https://regex101.com/r/h3OGvN/1

为什么不使用 grep?

$ data='##bcftools_mergeCommand=merge --force-samples -m none -O v -o analysis/STUDY1/hg19/exome/merged.vcf --threads 4 analysis/STUDY1/hg19/exome/varscan_norm.vcf.gz analysis/STUDY1/hg19/exome/gatk_norm.vcf.gz analysis/STUDY1/hg19/exome/samtools_norm.vcf.gz analysis/STUDY1/hg19/exome/freebayes_norm.vcf.gz'
$ echo $data | grep -Eo [^\/]+\.vcf\.gz
varscan_norm.vcf.gz
gatk_norm.vcf.gz
samtools_norm.vcf.gz
freebayes_norm.vcf.gz

  • -E: 将模式解释为扩展的正则表达式。
  • -o: 只打印匹配的(non-empty)部分。

Regex101 支持的正则表达式方言与 sed 理解的方言不同。

具体来说,(去掉多余的 g 标志并)添加一个 p 标志来打印匹配的行来修复这个特定的脚本;但在一般情况下,不要依赖不直接支持您实际想要使用的工具。

这可能对你有用 (GNU sed):

sed -E 'y/ \//\n\n/;/\`\S+\.vcf\.gz$/MP;D' file

将空格和 / 匹配到换行符,并使用 P;D 习语 print/delete 结果中第一行的匹配项