正则表达式捕获组在 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 给出:
为什么不使用 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 结果中第一行的匹配项
我发现了其他一些类似标题的问题,但没有找到答案。
我的文字是:
##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 给出:
为什么不使用 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 结果中第一行的匹配项