0

我正在尝试在 bash 中重命名几个不同的文件。例如,如何将 temp_1 重命名为 temp_01 直到 09(temp_9 到 temp_09)?

我使用了 sed 但不知何故没有工作。

我试过这个:

 for i in temp_?.txt; 
 do
   j=echo $i | sed 's/[^0-9]*/0[^0-9]*/g';
   mv "$i" "$j"; 
 done 
4

4 回答 4

1

尝试将您的sed命令修改为类似

sed 's/[0-9]/0&/'

这将为您的示例案例完成工作。

您的命令不起作用,因为当您尝试引用匹配的字符串时实际上并没有:它是用&(for the whole match) 或 numbered references完成的。

于 2012-06-21T12:40:35.477 回答
1

不需要sed;只需使用您对文件名的了解:

for i in {0..9}
do
   mv temp_$i.txt temp_0$i.txt
done
于 2012-06-21T13:03:11.650 回答
0

它不起作用,因为您没有捕获 sed 的输出,您需要将其放入反引号或$( ... ). 另外,你的 RE 错了,试试这个:

for i in temp_?.txt 
do  
    j=$(echo $i | sed 's/\([0-9]\{1,\}\)/0\1/g')
    mv "$i" "$j"   
done   

注意:我更喜欢使用 -E 选项来sed扩展正则表达式,但我不知道你是否sed支持它。

于 2012-06-21T12:58:18.307 回答
0

你需要逃避你的变量赋值

j=`echo echo $i | sed 's/[^0-9]*/0[^0-9]*/g'`

此外,您不需要在每条语句的末尾使用分号,除非您将所有操作都放在一行中

于 2012-06-21T22:51:30.643 回答