5

我有一个这样的文件列表:

wgEncodeCaltechRnaSeqGm12878R1x75dFastqRep1.fastq.trim.tags.sam
wgEncodeCaltechRnaSeqGm12878R1x75dFastqRep2.fastq.trim.tags.sam
wgEncodeCshlLongRnaSeqGm12878CellPapFastqRd1Rep1.fastq.trim00.tags.sam
wgEncodeCshlLongRnaSeqGm12878CellPapFastqRd1Rep1.fastq.trim01.tags.sam
wgEncodeCshlLongRnaSeqGm12878CellPapFastqRd1Rep1.fastq.trim02.tags.sam
wgEncodeCshlLongRnaSeqGm12878CellPapFastqRd1Rep2.fastq.trim00.tags.sam
wgEncodeCshlLongRnaSeqGm12878CellPapFastqRd1Rep2.fastq.trim01.tags.sam
wgEncodeCshlLongRnaSeqGm12878CellPapFastqRd1Rep2.fastq.trim02.tags.sam
wgEncodeCshlLongRnaSeqGm12878CellPapFastqRd2Rep1.fastq.trim00.tags.sam
wgEncodeCshlLongRnaSeqGm12878CellPapFastqRd2Rep1.fastq.trim01.tags.sam

我想从文件名中删除 Rd1、Rd2 和 .sam 字符串。使用以下 bash 脚本,我可以使用两个命令删除 Rd1、Rd2 和 .sam 字符串....

for i in $(ls)

do

echo "${i/Rd?/}"
echo "${i/.sam/}"

done

但是我想知道如何一步完成两个替换你知道怎么做吗?

谢谢你的时间!

4

2 回答 2

8

您可以使用扩展模式在bash.

shopt -s extglob
echo ${i//@(Rd?|.sam)}

这是细分:

  1. 用于//替换所有出现的模式,而不仅仅是第一个。
  2. @(Rd?|.sam)是一个扩展模式,它匹配 。管道将两个子模式分开。Rd?.sam

从技术上讲,您希望能够避免从单词中间删除“.sam”,但看起来这对您的用例来说是安全的。

于 2012-06-15T19:07:20.507 回答
2

我们当然知道!

for i in *
do
   echo $i | sed 's/Rd.//;s/\.sam$//'
done

当你想重命名这些文件时:

for i in *
do
   mv "$i" "$(echo $i | sed 's/Rd.//;s/\.sam$//')"
done
于 2012-06-15T18:38:17.460 回答