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

Ann*_*ann 4 bash

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

TEST_EXAMPLE_SUFFIX.file
Output = TEST_EXAMPLE
Run Code Online (Sandbox Code Playgroud)

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

FILE_EXT=_SUFFIX
/.+?(?=$FILE_EXT)/
Run Code Online (Sandbox Code Playgroud)

但是当它们作为for循环的一部分一起管道时:

for t in $(ls *.fastq | sed -e /.+?(?=$READ1_EXT)/)
Run Code Online (Sandbox Code Playgroud)

我收到错误:

command substitution: line 14: syntax error near unexpected token `('
Run Code Online (Sandbox Code Playgroud)

我做错了什么?

sjs*_*sam 5

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

for t in *_SUFFIX.fastq 
do
  echo "${t%_SUFFIX.fastq}" #stips _SUFFIX.fastq part
done
Run Code Online (Sandbox Code Playgroud)

参考


编辑:

为了解决重复发生的问题,您可以执行以下操作:

想想看,你有感兴趣的两个文件Test_R1.fileTest_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
Run Code Online (Sandbox Code Playgroud)

  • @AnnaSchumann:我们使用`arry`前面的`!`迭代`数组键',它们确实是`filenames`,没有后缀.请参阅答案中的参数扩展链接,它可以解释相同和更多很酷的功能. (2认同)