好的,我有很多文件都包含版本号v1或v2。我想将文件名与其他文件匹配,这些文件组成第二个文件,如下所示: train.v1_GENENAME_ID.debruijn.txt(这就是我想要的)
第一个文件的组成如下: train.GENENAME_ID_v1.debruijn.txt
所以v1应该在GENENAME之前移动。所有版本标识符都相同。即v1或v2
假设我有一个名为'train.Glis2_1757.2_v1_deBruijn.txt'
的文件,我想将其转换为此'train.v1_Glis2_1757.2_deBruijn.txt'
是否有一种简单的方法可以从第一个文件名中取出v1并将其放在第二个文件名中?
我在考虑将grep与if语句结合使用。但仍未设法使其发挥作用。
感谢任何提示/提示。
答案 0 :(得分:2)
使用与perl分发的rename
:
rename 's/(train.)(.*_)(v[0-9].)(deBruijn.txt)/$1$3$2$4/' *
在某些系统上,它被称为'ren'或'pren'。
答案 1 :(得分:1)
这是一个使用for循环并使用sed
转换文件名
for f in *.txt;
do
nf=$(echo $f | sed -r 's/([^.]+\.)([^.]+\.)([0-9])_([^_]+)(.*)/\1\4_\2\3\5/')
echo mv $f $nf
done
如果您对结果感到满意,可以删除echo
并重命名
根据您的要求,此处是带注释的版本,说明如何提取和重新排列各个部分以适合所需的输出
echo "train.Glis2_1757.2_v1_deBruijn.txt" | sed -r
's/([^.]+\.) # match all non-dot characters (+ meaning one or more) followed by a dot and store in group 1 (train.)
([^.]+\.) # match all non-dot characters followed by a dot and store in group 2 (Glis2_1757.)
([0-9]) # match a single digit and store in group 3 (2)
_
([^_]+) # match all non-underscore characters and store in group 4 (v1)
(.*) # match all that follow . is a wildcard char in regex and * is for zero or more (_deBruijn.txt)
/\1\4_\2\3\5/' # rearranging the matches to get desired output
答案 2 :(得分:1)
你可以在parameter expansion的shell中执行此操作,特别是后缀和前缀删除:
FN=train.Glis2_1757.2_v1_deBruijn.txt
STRIPPED=${FN%_deBruijn.txt} # "train.Glis2_1757.2_v1"
GENEVERS=${STRIPPED#train.} # "Glis2_1757.2_v1"
VERSION=${GENEVERS##*_} # "v1"
GENENAME=${GENEVERS%_v[12]} # "Glis2_1757.2"
NEWFN=train.${VERSION}_${GENENAME}_deBruijn.txt # "train.v1_Glis2_1757.2_deBruijn.txt"
mv $FN $NEWFN
您不必完成上述所有明确的命名步骤,但我认为更清楚。此外,这种技术可以推断为具有任意前缀(除了“train。”)和后缀(除“_deBruijn.txt”之外),假设您可以使用shell模式表示法来表示它们。