命令行中的以下sed
命令返回我期望的内容。
$ echo './Adobe ReaderScreenSnapz001.jpg' | sed -e 's/.*\./After-1\./'
After-1.jpg <--- result
Howerver,在下面的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.
我哪里错了?谢谢。
答案 0 :(得分:4)
您已在脚本中省略了程序周围的单引号。在没有引用的情况下,shell将从.*\.
中删除反斜杠,从而产生具有完全不同含义的正则表达式。 (但是你需要双引号才能使替换工作。你可以混合使用单引号和双引号's/.*\./'"After-$i./"
或只是添加足够的反斜杠来逃避转义的转义序列(原文如此)。
答案 1 :(得分:1)
只需使用参数扩展
即可#!/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)
我还修改了一些引用来防止不必要的分词