正则表达式 - 提取直到匹配并且不包括该匹配

时间:2016-08-29 13:54:09

标签: bash

我尝试捕获同时删除文件扩展名和后缀的文件名,例如:

TEST_EXAMPLE_SUFFIX.file
Output = TEST_EXAMPLE

我想在匹配_SUFFIX部分并提取之前的所有字符(不包括_SUFFIX)的基础上这样做。通常我会使用类似的东西:

FILE_EXT=_SUFFIX
/.+?(?=$FILE_EXT)/

然而,当将它们作为for循环的一部分组合在一起时:

for t in $(ls *.fastq | sed -e /.+?(?=$READ1_EXT)/)

我收到错误:

command substitution: line 14: syntax error near unexpected token `('

我做错了什么?

2 个答案:

答案 0 :(得分:5)

不解析ls输出,您可以使用bash参数扩展 实现您的需求

for t in *_SUFFIX.fastq 
do
  echo "${t%_SUFFIX.fastq}" #stips _SUFFIX.fastq part
done

<强>参考

修改

为了解决重复发生的问题,你可以这样做:

考虑您有两个感兴趣的文件Test_R1.file&amp; Test_R2.file并且您希望Test只在结果中出现一次,例如

declare -A arry # declaring an associative array
for t in Test_R*.file
do
  arry["${t%_R*.file}"]=1 
  # stips _R(number).file part and makes it a key to arry
  # Remember arry keys are unique.
  # The assignment ie '=1' is not relevant here, you can assign any value
done
# We are all set to print the unique filenames
echo "${!arry[@]}"
# "${!arry[@]}" expands to the list of array indices (keys) for arry

答案 1 :(得分:1)

您可以使用bash参数扩展来执行此操作,假设文件名的持久格式为:

for file in *_SUFFIX.fastq; do echo "${file%_*}"; done

for构造迭代.fastq个文件。

示例:

$ file=TEST_EXAMPLE_SUFFIX.fastq

$ echo "${file%_*}"
TEST_EXAMPLE