2011-08-11 23 views
6

私は、いくつかの変数をとり、文字列を持つファイルのリストを取得するためにgrepを使って特定のファイル検索を検索/置換するbashスクリプトを作成しようとしています。私は問題がsedで見られる変数を持っていると思う私は他の何があるか分からない。forループ内の変数でsedを使用するBashスクリプト?

if [ "$searchFiles" != "" -a "$oldString" != "" -a "$newString" != "" ]; then 
    echo -en "Searching for '$searchFiles' and replacing '$oldString' with '$newString'.\n" 
    for i in `grep $oldString $searchFiles |cut -d: -f1|uniq`; do 
     sed -i 's/${oldString}/${newString}/g' $i; 
    done 
    echo -en "Done.\n" 
else 
    usage 
fi 
+0

あなたは私が思うのbashで変数置換のための二重引用符を必要とする - 'sedの-i「S/$ {oldString}/$ {newString}/g "$ i; – arunkumar

答えて

15

は二重引用符を使用するので、シェルは変数を代用できます。

for i in `grep -l $oldString $searchFiles`; do 
    sed -i "s/${oldString}/${newString}/g" $i; 
done 

検索または置き換える文字列はあなたがそれらをエスケープする必要がある特殊文字が含まれている場合:Escape a string for a sed replace pattern

+0

ありがとうございました。ありがとうございました。文字列をエスケープするのに役立つ場所を指摘してくれてありがとうございます。それが私の次の仕事でした。 – LF4

4

二重引用符を使用にそれはsedを呼び出す前に、環境変数はシェルによって展開されるように:

sed -i "s/${oldString}/${newString}/g" $i; 

は警戒してください:oldStringまたはnewStringのいずれかが、スラッシュや他の正規表現の特殊文字が含まれている場合、彼らはなりますリテラル文字列としてではなく、特別な意味として解釈されます。

関連する問題