我将文件名传递到 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/