Regex 匹配固定字符串+;数字0-10和grep
我有这样一个文件列表:Regex 匹配固定字符串+;数字0-10和grep,regex,bash,grep,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.
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
为了执行一些下游操作,我只想通过“Bob10”返回标记为“Bob1”的文件,同样,我想通过“Bob20”返回标记为“Bob11”的文件
我一直在尝试使用grep
对正则表达式执行此操作,但无法同时匹配“Bob”和相邻的数值范围。例如,这是许多行中不起作用的一行:
grep -E "Bob@([10|0-9])"
根据我在网上找到的不同教程,我在不同的地方尝试了许多不同的组合,包括Bob
,10 | 0-9
,“
,()
,[]
,但迄今为止都没有成功
编辑:为了完整起见,@anubhava给出的解决方案解决了上述问题:
grep -E "Bob(10|[0-9])_"
我并没有特别要求正则表达式返回范围的另一半“Bob11”-“Bob20”,但根据第页,我为它提出了这个解决方案:
您可以对文件使用此regex for
grep
:
grep -E "Bob(10|[0-9])_" file
但是,如果在目录中使用glob
模式,则使用此扩展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
如果您使用的工具可以进行数学运算,而不是依赖regexp,那么您可以选择任何您喜欢的范围:
$ 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
$awk-F'-Bob |"3+0>7&&3+0感谢您的快速回复。这就是解决方案:grep-E“Bob(10 |[0-9])_“
。结果表明,尾随的“u”起了作用,因为除此之外,Bob11-Bob20的匹配也会不断返回,因为“Bob1
x”和“Bob2
x”也与原始模式匹配。
$ 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