2013-02-14 18 views
6

私は私は、コマンドライン引数としてブラッドを提供することになっています sedをコマンドライン引数で使用しますか?

のsedの/ブラッド/ピット/ G '

シェルスクリプトの一部として、このようなsedコマンドを実行する必要がありますこのコマンドが動作している間に、どのような私はだろう、この

sedのS/$ 1 /ピット/ gで

のようなコマンドを実行します。私が引用符を必要とする置換文字列内にいくつかの内容を持つかもしれないので、引用符を削除せずにこのコマンドを実行するにはどうすればよいか知りたいです。

私は引用符には自信がありません。そのため、ちょっとした調整でどのように動作するのか見たいのですが?

答えて

15

することはできsed "s/$1/pitt/g"または

sed 's/'$1'/pitt/g'または、コマンドライン引数は、単純な単語、sed 's/'"$1"'/pitt/g'がない場合。

+0

2つ目の点を詳しく教えてください。二重引用符はどのように役立ちますか?私はどんな種類の入力が必要なのかを意味します。 – Dude

+0

は「複数の単語」のように入力します。それが特殊文字(sedによって解釈される)を含んでいれば、もう少し複雑になってきます。 –

+0

はい、それは私を心配しているものです:( – Dude

3

あなたがそれを行うことができる2つの方法があります。

1)

sed "s/$1/pitt/g" 

2重引用符を使用)文字列としてコマンドを構築し、evalの

SEDCMD="s/$1/pitt/g" 
eval sed $SEDCMD 

でそれを実行しますevalメソッドは動作し、非常に柔軟性がありますが、コードインジェクションに対して脆弱であるため危険です。あなたの入力を信頼しない場合は、#2を使用しないでください。

更新:コメントは正しく、evalを使用する利点はありません(私はいつもsedでこの方法でevalを使用していましたが、しかし、後で使うためにsed文字列を作成することは強力です:新しい3)を追加し、2人をモックに残す

3)文字列としてコマンドを構築し、 1つ以上を実行してください

FOO='s/\(.*\)bar/\1baz/' 
BAR="s/$1/pitt/g" 
sed -e $BAR -e $FOO <infile >outfile 
+2

'eval'は、*ゼロ*のメリットを持つ恐ろしいアイデアです –

+0

あなたの入力を信頼しない場合は#1を使用しないでください。また、コードの注入にも適しています。 –

+0

@ /他の人:1つのコードの注入例を表示してください –

関連する問題