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

Gep*_*ada 4 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
Run Code Online (Sandbox Code Playgroud)

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

for i in $(ls)

do

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

done
Run Code Online (Sandbox Code Playgroud)

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

谢谢你的时间!

che*_*ner 5

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

shopt -s extglob
echo ${i//@(Rd?|.sam)}
Run Code Online (Sandbox Code Playgroud)

这是细分:

  1. 使用//替换所有匹配模式,而不只是第一个.
  2. @(Rd?|.sam)是一个扩展的图案,它匹配任一 Rd?.sam.管道将两个子图案分开.

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