命令行中的以下sed命令返回了我所期望的结果。
$ echo './Adobe ReaderScreenSnapz001.jpg' | sed -e 's/.*\./After-1\./'
After-1.jpg <--- result然而,在下面的bash脚本中,sed看起来并不像我期望的那样。
#!/bin/bash
beforeNamePrefix=$1
i=1
while IFS= read -r -u3 -d '' base_name; do
echo $base_name
rename=`(echo ${base_name} | sed -e s/.*\./After-$i./g)`
echo 'Renamed to ' $rename
i=$((i+1))
done 3< <(find . -name "$beforeNamePrefix*" -print0)结果(在同一目录中有几个名称相似的文件):
./Adobe ReaderScreenSnapz001.jpg
Renamed to After-1. <--- file extension is missing.
./Adobe ReaderScreenSnapz002.jpg
Renamed to After-2.
./Adobe ReaderScreenSnapz003.jpg
Renamed to After-3.
./Adobe ReaderScreenSnapz004.jpg
Renamed to After-4.我哪里错了?谢谢。
发布于 2012-02-06 02:47:57
只需使用参数扩展
#!/bin/bash
beforeNamePrefix="$1"
i=1
while IFS= read -r -u3 -d '' base_name; do
echo "$base_name"
rename="After-$((i++)).${base_name##*.}"
echo "Renamed to $rename"
done 3< <(find . -name "$beforeNamePrefix*" -print0)我还修复了一些引号,以防止不需要的单词拆分
发布于 2012-02-06 02:48:45
您在脚本中省略了程序两边的单引号。如果没有引号,shell将去掉.*\.中的反斜杠,生成一个含义完全不同的正则表达式。(不过,您需要使用双引号才能使替换生效。您可以混合使用单引号和双引号's/.*\./'"After-$i./",或者只添加足够的反斜杠来转义转义序列(原文如此)。
https://stackoverflow.com/questions/9151875
复制相似问题