bash - 使用 sed 将文件名中的数值填充为三位数

标签 bash sed file-rename

我将文件名传递到 bash 脚本中并使用 sed 清理该名称。一些示例文件是:

Test 01.txt
Test v2 01.txt

我想回来:

Test 001.txt
Test v002 001.txt

这是我的脚本

#!/bin/bash

SAVEIFS=$IFS
IFS=$(echo -en "\n\b")
for f in $@
do

j=`basename "$f" ".???"`
BASENAME=`basename "$f" ".???"`
DIRNAME=`dirname "$f"`

j=`echo $j |sed -e 's/\///g'`
j=`echo $j |sed -e 's/_/ /g'`
j=`echo $j |sed -e 's/^\.//'`
j=`echo $j |sed -e 's/\[[^()]*\]//g'`
j=`echo $j |sed -e 's/([^()]*)//g'`
j=`echo $j |sed -e 's/#//g'`
j=`echo $j |sed -e 's/+/\ /g'`
j=`echo $j |sed -e 's/\.\././g'`
j=`echo $j |sed -e 's/\&/and/g'`
j=`echo $j |sed -e 's/\ -/-/g'`
j=`echo $j |sed -e 's/-\ /-/g'`
j=`echo $j |sed -e 's/-{2,}/-/g'`
j=`echo $j |sed -r -e 's/\d+/sprintf("%03d",$&)/e'`
j=`echo $j |sed -e 's/\.\././g'`
j=`echo $j |sed -e "s/\'//g"`
j=`echo $j |sed -r -e 's/ {2,}/ /g'`
j=`echo $j |sed -e 's/\ \././g'`

if [ "$BASENAME" != "$j" ]; then
  mv -v "$f" "$DIRNAME"/"$j"
fi

done

这是问题所在

j=`echo $j |sed -r -e 's/\d+/sprintf("%03d",$&)/e'`

正则表达式适用于 rename,但不适用于 sed。

最佳答案

而不是

sed -r -e 's/\d+/sprintf("%03d",$&)/e'

使用

perl -pe 's/\d+/sprintf("%03d",$&)/ge'

关于bash - 使用 sed 将文件名中的数值填充为三位数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9896070/

相关文章:

ruby-on-rails - 在终端输出上播放声音

ubuntu - SED - 变量上的 "Filename too long"

bash - 如果文件名在 Bash 中有前缀,则在句点之前去除字符

windows - 如何使用 Windows 批处理文件重命名大量文件夹

linux - 使用 bash 在连字符之间批量重命名文件名

mysql - 如何将 mysql SELECT 读入 bash 变量,然后使用这些变量 INSERT INTO 不同的表

xcode - 如何使用 bash 查找文本字符串 --> "PROVISIONING_PROFILE[sdk=iphoneos*]"<--这个字符串有很多特殊字符

linux - 如何在Linux中循环中按值打印数组?

python - 使用子进程在管道输出上调用 sed 结果不一致

linux - 按特定顺序重命名一组文件而不丢失它们(在 Linux 上)