2012-02-05 13 views
0

次のコマンドラインのsedコマンドは、私が期待しているものを返します。sedの結果がb/wのコマンドラインとシェルスクリプトと異なる

$ echo './Adobe ReaderScreenSnapz001.jpg' | sed -e 's/.*\./After-1\./' 
After-1.jpg    <--- result 

Howerverは、以下のbashスクリプトでは、sedは、私が期待として機能することはないseeems。

#!/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

あなたの 'sed'コマンドは大文字ではありません。両方のバージョンで同じです – Mat

+0

OOC、なぜstdinの代わりにfd 3を使用していますか? – SiegeX

+1

@SiegeX:彼は私の[以前の質問への回答]を使用しています(http://stackoverflow.com/questions/9145760/bash-script-strings 9147793#9147793);ループの中の何かがstdinから読み込むことを決める場合(通常は面白い結果を得るため)fd 3を慣れて使用します。 –

答えて

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) 

パラメータ展開を使用して、私はまた、不要な単語あなたのスクリプトでプログラムの周りの単一引用符を省略している

4

を分割するのを防ぐために引用一部を修正しました。引用符を付けないと、シェルはバックスラッシュを.*\.から取り除いて、まったく異なる意味を持つ正規表現を生成します。 's/.*\./'"After-$i./"を混ぜるか、エスケープされたエスケープシーケンス(エスケープシーケンス)をエスケープするのに十分なバックスラッシュを追加することができます。

関連する問題