我有一个像这样的文件列表:
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
但我想知道如何一步完成两个替换 你知道怎么做吗?
谢谢你的时间!
答案 0 :(得分:5)
您可以使用扩展模式在bash
中完成所有操作。
shopt -s extglob
echo ${i//@(Rd?|.sam)}
以下是细分:
//
替换所有出现的模式,而不仅仅是第一个模式。@(Rd?|.sam)
是一种扩展模式,与 Rd?
或.sam
相匹配。该
管道将两个子模式分开。从技术上讲,您希望能够避免从单词的中间删除“.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