匹配固定字符串+数字0-10与grep

时间:2016-02-18 18:33:20

标签: regex bash grep

我有一个文件列表,例如:

Sample_lane1-Bob10_R1.fastq.gz
Sample_lane1-Bob1_R1.fastq.gz
Sample_lane1-Bob2_R1.fastq.gz
Sample_lane1-Bob4_R1.fastq.gz
Sample_lane1-Bob5_R1.fastq.gz
Sample_lane1-Bob7_R1.fastq.gz
Sample_lane1-Bob8_R1.fastq.gz
Sample_lane1-Bob9_R1.fastq.gz
Sample_lane2-Bob10_R1.fastq.gz
Sample_lane2-Bob1_R1.fastq.gz
Sample_lane2-Bob3_R1.fastq.gz
Sample_lane2-Bob4_R1.fastq.gz
Sample_lane2-Bob6_R1.fastq.gz
Sample_lane2-Bob7_R1.fastq.gz
Sample_lane2-Bob8_R1.fastq.gz
Sample_lane2-Bob9_R1.fastq.gz
Sample_lane3-Bob11_R1.fastq.gz
Sample_lane3-Bob12_R1.fastq.gz
Sample_lane3-Bob13_R1.fastq.gz
Sample_lane3-Bob15_R1.fastq.gz
Sample_lane3-Bob16_R1.fastq.gz
Sample_lane3-Bob18_R1.fastq.gz
Sample_lane3-Bob19_R1.fastq.gz
Sample_lane3-Bob20_R1.fastq.gz
Sample_lane5-Bob11_R1.fastq.gz
Sample_lane5-Bob12_R1.fastq.gz
Sample_lane5-Bob16_R1.fastq.gz
Sample_lane5-Bob17_R1.fastq.gz
Sample_lane5-Bob19_R1.fastq.gz
Sample_lane5-Bob20_R1.fastq.gz
Sample_lane8-Sample1_R1.fastq.gz
Sample_lane8-Sample2_R1.fastq.gz
Sample_lane8-Sample3_R1.fastq.gz
Sample_lane8-Sample4_R1.fastq.gz
Sample_lane8-Sample5_R1.fastq.gz

我想只返回标有' Bob1'的文件。通过' Bob10'为了执行一些下游操作,我想返回标记为' Bob11'的文件。通过' Bob20'与此类似。

我一直在尝试使用grep使用正则表达式,但无法匹配“Bob'和相邻的数值范围。例如,这是许多尚无效的行之一:

grep -E "Bob@([10|0-9])"

根据我找到的不同教程,我在不同的地方尝试了Bob10|0-9"()[]的许多不同组合在线,但到目前为止还没有工作。

编辑:为了完整起见,@ anubhava给出的解决方案解决了上述问题:

grep -E "Bob(10|[0-9])_"

我并没有特别要求正则表达式返回范围的另一半,' Bob11' - ' Bob20',但按照{{{}提出了这个解决方案3}}页面:

grep -E "Bob([1-2][1-9])_"

2 个答案:

答案 0 :(得分:3)

您可以将此正则表达式用于grep对文件:

grep -E "Bob(10|[0-9])_" file

但是,如果您在目录中使用glob模式,请使用此extended glob

shopt -s extglob
printf "%s\n" *Bob@(10|[[:digit:]])_*

<强>输出:

Sample_lane1-Bob10_R1.fastq.gz
Sample_lane1-Bob1_R1.fastq.gz
Sample_lane1-Bob2_R1.fastq.gz
Sample_lane1-Bob4_R1.fastq.gz
Sample_lane1-Bob5_R1.fastq.gz
Sample_lane1-Bob7_R1.fastq.gz
Sample_lane1-Bob8_R1.fastq.gz
Sample_lane1-Bob9_R1.fastq.gz
Sample_lane2-Bob10_R1.fastq.gz
Sample_lane2-Bob1_R1.fastq.gz
Sample_lane2-Bob3_R1.fastq.gz
Sample_lane2-Bob4_R1.fastq.gz
Sample_lane2-Bob6_R1.fastq.gz
Sample_lane2-Bob7_R1.fastq.gz
Sample_lane2-Bob8_R1.fastq.gz
Sample_lane2-Bob9_R1.fastq.gz

答案 1 :(得分:1)

如果你使用的工具可以做数学而不是依赖正则表达式,那么你可以选择你喜欢的任何范围:

$ awk -F'-Bob|_' '$3+0>7 && $3+0<13' file       
Sample_lane1-Bob10_R1.fastq.gz
Sample_lane1-Bob8_R1.fastq.gz
Sample_lane1-Bob9_R1.fastq.gz
Sample_lane2-Bob10_R1.fastq.gz
Sample_lane2-Bob8_R1.fastq.gz
Sample_lane2-Bob9_R1.fastq.gz
Sample_lane3-Bob11_R1.fastq.gz
Sample_lane3-Bob12_R1.fastq.gz
Sample_lane5-Bob11_R1.fastq.gz
Sample_lane5-Bob12_R1.fastq.gz