2017-08-23 7 views
1
#!/usr/bin/env bash 
DOCUMENT_ROOT=/var/www/html/ 

rm index.php 
cd modules/mymodules/ 

perl -p -i -e 's/x.xx.xx.y/dd.dd.ddd.dd/g' `grep -ril y.yy.yy.y *` 

ショーはそれは、スクリプトの残りの部分を実行することができない警告のperl -p -i -eシェルスクリプト内の

-i used with no filenames on the command line, reading from STDIN. 

を示しています。

すべてのソリューションはありますか?

は、実際に私は私がドッキングウィンドウでのUbuntuを使用しています

perl -p -i -e 's/x.xx.xx.y/dd.dd.ddd.dd/g' `grep -ril y.yy.yy.y *` 
Inside a shell script 

を実行する必要があります。

+3

'-i'を削除してみませんか? – Jens

+1

細く絞ってみてください。それはシェルスクリプトの外で動作しますか?そうでない場合、それは「シェルスクリプトの内部のperl -p -i -e」を使用してコマンドや問題ではありません –

+0

'.'は、正規表現パターンで特別な意味を持っています。 'x.xx.xx.y'は' x \ .xx \ .xx \ .y'でなければなりません。 – ikegami

答えて

4

これを一歩一歩見てみましょう。まず、あなたがこのgrepコマンドを実行している:

grep -ril y.yy.yy.y * 

これは再帰的に現在のディレクトリ内のすべてのファイルとディレクトリを検索します。いずれにしても "y.yy.yy.yy"という文字列を含むファイルを探し、このテキストを含むファイルのリストを返します。

このコマンドは、ファイル名のリストを返すか、何も返しません。そのgrepコマンドから返されるものは何でも

は、その後、あなたのPerlコマンドの引数として渡されます。

perl -p -i -e 's/x.xx.xx.y/dd.dd.ddd.dd/g' [list of filenames] 

grepは、ファイルのリストを返す場合、ここで-pオプションは、内のすべてのファイルで、各ラインを意味し、リストはその置換を順番に実行し、新しいファイルに出力されます。 -iには、古いファイルごとに新しいファイルが1つあり、新しいファイルには古いファイルと同じ名前が付けられています(古いファイルはコマンドが実行されると削除されます)。

これまでのところとても良いです。しかし、grepがファイル名を返さない場合はどうなりますか?その場合、Perlコマンドはファイル名を取得せず、表示されているエラーを引き起こします。

あなたのgrepコマンドがあなたの望むことをしておらず、ファイル名の空のリストを返すということです。 grepコマンドを単独で実行し、取得した内容を確認してください。

+2

'perl'コマンドにパイプされているデータはありません。むしろ 'grep'コマンドで生成されたファイル名のリストが期待通りに出力されていないことがあります。 – chepner

+1

@chepner:もちろん、あなたは絶対に正しいです。私の更新を参照してください。 –

+3

'grep'が空リストを返すことができる場合は、' grep -ril y.yy.yy.y * | xargs perl -peの/ x.xx.xx.y/dd.dd.ddd.dd/g''または 'find。 -type f -exec perl -i -0777pe/x.xx.xx.y/dd.dd.ddd.dd/g if /y\.yy\.yy\.y/i '{} + ' – ikegami

関連する問題