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 スクリプトでは、2 つのコマンドを使用して Rd1、Rd2、および .sam 文字列を削除できます。

for i in $(ls)

do

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

done

しかし、私は 1 つのステップで 2 つの置換を行う方法を知りたいです。

御時間ありがとうございます!

4

2 に答える 2

8

拡張パターンを使用して、すべてを で実行できますbash

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

内訳は次のとおりです。

  1. //最初のパターンだけでなく、パターンのすべてのオカレンスを置換するために使用します。
  2. @(Rd?|.sam)または のいずれ Rd?かに一致する拡張パターン.samです。パイプは 2 つのサブパターンを分離します。

技術的には、単語の途中から「.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 に答える