从文件名中删除字符串以保留变量?

从文件名中删除字符串以保留变量?

我有以下文件列表:

Dorn_Triatomine_A5201_sequence_1_unmappedforTdim_tdim.alleles.tsv
Dorn_Triatomine_A5201_sequence_1_unmappedforTdim_tdim.matches.tsv
Dorn_Triatomine_A5201_sequence_1_unmappedforTdim_tdim.snps.tsv
Dorn_Triatomine_A5201_sequence_1_unmappedforTdim_tdim.tags.tsv
Dorn_Triatomine_T9252_sequence_1_unmappedforTdim_tdim.alleles.tsv
Dorn_Triatomine_T9252_sequence_1_unmappedforTdim_tdim.matches.tsv
Dorn_Triatomine_T9252_sequence_1_unmappedforTdim_tdim.snps.tsv
Dorn_Triatomine_T9252_sequence_1_unmappedforTdim_tdim.tags.tsv

我想消除一些重复的字符串并将文件重命名如下:

A5201_tdim.等位基因.tsv
A5201_tdim.matches.tsv
A5201_tdim.snps.tsv

我尝试使用:

mv Dorn_Triatomine_*_sequence_1_unmappedforTdim_tdim.tags.tsv *_tdim.tags.tsv 

完成此任务的最简单方法是什么?

答案1

这个脚本应该做到这一点:

#!/bin/sh
for f in Dorn_Triatom* ; do
  mv "$f" `echo "$f" | sed -e 's/Dorn_Triatomine_//' -e 's/sequence_1_unmappedforTdim_//'`
done

答案2

与 PCRE 一起使用grep来获取新文件名:

#!/bin/bash
for file in *.tsv; do
  newname="$(grep -Po '^[^_]*_[^_]*_\K[^_]*_'<<<"$file")$(grep -Po '.*_\K.*$' <<<"$file")"
  mv "$file" "$newname"
done 

newname是两个操作的输出的组合grep

  • grep -Po '^[^_]*_[^_]*_\K[^_]*_'<<<"$file"A5201_将从每个文件名输出类似的字符串

  • $(grep -Po '.*_\K.*$' <<<"$file")将匹配文件名的最后部分,在最后一个之后_

  • $()bash命令替换模式。

相关内容