sed结果不同b / w命令行& shell脚本

时间:2012-02-05 18:37:47

标签: bash shell sed

命令行中的以下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.

我哪里错了?谢谢。

2 个答案:

答案 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)

我还修改了一些引用来防止不必要的分词