从字符串中删除两个子字符串

时间:2012-06-15 18:32:31

标签: string bash

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

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 stings。使用以下bash脚本,我可以使用两个命令删除Rd1,Rd2和.sam字符串....

for i in $(ls)

do

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

done

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

谢谢你的时间!

2 个答案:

答案 0 :(得分:5)

您可以使用扩展模式在bash中完成所有操作。

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

以下是细分:

  1. 使用//替换所有出现的模式,而不仅仅是第一个模式。
  2. @(Rd?|.sam)是一种扩展模式,与 Rd?.sam相匹配。该  管道将两个子模式分开。
  3. 从技术上讲,您希望能够避免从单词的中间删除“.sam”, 但看起来这对你的用例来说是安全的。

答案 1 :(得分: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