如何匹配以下模式的正则表达式?

How to match the regex for the below pattern?

我正在尝试编写一个应该像下面这样工作的脚本,但不知何故无法获得放置语法的写入方式。

我有 S_12_O_319_K4me1.

这样的文件夹

虽然内容在每个文件夹中 S_12_O_319_K4me1_S12816.sorted.bam

所以我想写一个脚本,我的脚本循环进入我的同名文件夹,然后识别 *.bam 文件并执行操作,但我无法将正则表达式放入.这是我试过的:

#!/bin/bash
#$ -S /bin/bash

spp_run=/path/phantompeakqualtools/run_spp.R
bam_loc=/path/ChIP-Seq/output

samples="S_12_O_319_K27me3
S_12_O_319_K4me1
S_12_O_319_K4me3
S_12_O_319_K27ac"

for s in $samples; do

    echo "Running SPP on $s ..."
    Rscript $spp_run -c=$bam_loc/$s/${s}_S[[0-9]+\.sorted.bam -savp -out=$bam_loc/$s/${s}".run_spp.out"
done

我无法识别与上述正则表达式匹配的数字。

我哪里弄错了?

编辑: 我在下面试过还是不行,在Rscript中解析有问题,但为什么会这样呢

#!/bin/bash
#$ -S /bin/bash

spp_run=/path/tools/phantompeakqualtools/run_spp.R
bam_loc=/path/ChIP-Seq/output

samples="S_12_O_319_K27me3
S_12_O_319_K4me1
S_12_O_319_K4me3"

for s in $samples; do
    echo "Running SPP on $s ..."
    echo $bam_loc/$s/${s}_S*.sorted.bam
    inbam=$bam_loc/$s/${s}_S*.sorted.bam
    echo $inbam
    Rscript $spp_run -c=$inbam -savp -out=$bam_loc/$s/${s}".run_spp.out"
done
echo "done"

错误

Error in parse.arguments(args) :
  ChIP File:/path/ChIP-Seq/output/S_12_O_319_K27me3/S_12_O_319_K27me3_S*.sorted.bam does not exist
Execution halted

无法识别文件,即使 $inbam 值为 /path/ChIP-Seq/output/S_12_O_319_K27me3/S_12_O_319_K27me3_S12815.sorted.bam

您可以在查找命令中使用正则表达式:

export spp_run=/path/phantompeakqualtools/run_spp.R
export bam_loc=/path/ChIP-Seq/output
export dir

samples=(S_12_O_319_K27me3 S_12_O_319_K4me1 S_12_O_319_K4me3 S_12_O_319_K27ac)

for dir in ${samples[@]}; do
  find . -type f -regex ".*/*${dir}_S[0-9]+\.sorted\.bam" \
    -exec bash -c 'echo Rscript $spp_run -c=$bam_loc/${dir}/${1##*/} -savp -out=$bam_loc/${dir}/${dir}".run_spp.out"' _ {} \;
done

注意:如果输出满足您的需要,只需删除 Rscript 之前的 echo

我找到了查询的答案,下面是代码。不是一个优雅的,但它有效。我意识到 Rscript 需要全名和完整路径,所以我只是将 echo 命令的输出初始化为一个变量,并将其作为输入文件参数传递给 Rscript,它获得了带有完整文件名的完整路径,所以现在它可以识别输入文件.

这不是一种优雅的方式,但对我来说仍然有效。

#!/bin/bash
#$ -S /bin/bash

spp_run=/path/tools/phantompeakqualtools/run_spp.R
bam_loc=/path/ChIP-Seq/output

samples="S_12_O_319_K27me3
S_12_O_319_K4me1
S_12_O_319_K4me3"

for s in $samples; do
    echo "Running SPP on $s ..."
    echo $bam_loc/$s/${s}_S*.sorted.bam
    inbam=$bam_loc/$s/${s}_S*.sorted.bam
    echo $inbam
    infile=`echo $inbam`
    Rscript $spp_run -c=$infile -savp -out=$bam_loc/$s/${s}".run_spp.out"
done
echo "done"

感谢大家的建议和意见。我的代码并不优雅,但它正在运行,所以我把答案放在这里。