如何重命名文件,保留原始文件名的可变部分

时间:2010-03-28 22:32:09

标签: shell

我正在尝试创建一个脚本,该脚本将进入一个目录并运行我自己的应用程序,每个文件都匹配一个正则表达式,特别是Test[0-9]*.txt

我的输入文件名看起来像这个TestXX.txt。现在,我可以使用剪切和切断Test.txt,但如果XX未预定义为两位数,我该如何做?如果我有Test1.txt,...,Test10.txt,我该怎么办?换句话说,我如何获得[0-9]*部分?

您知道,我希望能够制作OutputXX.txt:)

编辑:

我的文件名为Test[0-9]*.txt,我想将字符串操作为Output[0-9]*.txt

4 个答案:

答案 0 :(得分:2)

这样的事情有帮助吗?

#!/bin/bash
for f in Test*.txt ;
do
    process < $f > ${f/Test/Output}
done

Bash Shell Parameter Expansion

答案 1 :(得分:2)

关于bash中正则表达式的一个很好的教程是here。总而言之,您需要以下内容:

if [[$filenamein =~ "^Test([0-9]*).txt$"]]; then
  filenameout = "Output${BASH_REMATCH[1]}.txt"

等等。关键是,当您执行=~" regex-match, the "sub-matches" to parentheses-enclosed groups in the RE are set in the entries of array BASH_REMATCH (the [0] entry is the whole match, 1`第一个括号括起的组等时。)

答案 2 :(得分:1)

您需要在要保留的部分周围使用圆括号。

即。 “测试([0-9] *)。TXT”

替换这些括号内组的语法因程序而异,但您可能会发现可以使用\ 1,类似这样的内容:

S /测试(0-9 *)。TXT /输出\的1.txt /

如果您使用的是unix shell,那么'sed'可能是您进行转换的最佳选择。

http://www.grymoire.com/Unix/Sed.html#uh-4

希望有所帮助

答案 3 :(得分:0)

for file in Test[0-9]*.txt;
do
 num=${file//[^0-9]/}
 process $file > "Output${num}.txt"
done