2009-03-04 5 views
2

私は、ファイルで見つけて置き換えるためのPerlプログラムを呼び出す単純なkshをスクリプト化しました。それは素晴らしい作品Perlでインプレース編集中に加えられた変更を記録するにはどうすればよいですか?

perl -pi -e 's/find/replace/g' $1/*.html 

: 渡された引数は、ホームディレクトリです。しかし、私はすべての変更をログファイルに出力したいと思います。私は配管とリダイレクトを試みましたが、それを動作させることができませんでした。何か案は?

おかげで、STDERRへのすべての変更を送信するには、このような グレン

+0

を使用する場合、ファイル名を追加し、固定回線の番号表示あなたは「変化」が意味するものを明確にすることができますか?ログファイルには何が表示されるのですか? – chaos

+0

私は、置換前に検索文字列を含む行全体と一緒にファイル名を考えています。あなたに良い提案がない限り。おそらく、行番号が変更されたファイル名で十分でしょう。 –

+0

両方の答えは同様に機能します。私は最初に答えられたものを選んだ。助けてくれてありがとう。 –

答えて

8

何か:

perl -pi -e '$old = $_; s/find/replace/g and warn "${ARGV}[$.]: $old $_"; close ARGV if eof' $1/*.html 

更新:固定$。複数のファイルにあなたはSTDERRに印刷し、以下のようにファイルにだけSTDERR出力をリダイレクトすることができ

+0

ありがとう、私は今夜それを試してみましょう。あなたは変数を説明することができますか? denkfaulのソリューションは出力をlogfile.txtにリダイレクトします。あなたの解決策では、どの変数がログファイルを指しているのかわかりません。そして私はあなたに同じ質問をして、Perlの使用に関するdenkfaulに言いました。 –

+0

STDERRへの出力を「警告」するので、それをdenkfaulの答えのようにログファイルにリダイレクトできます。 "$ ARGV"は現在のファイルの名前、 "ARGV"はファイルハンドル、$ _は現在の行$です。現在の行番号です。 "perldoc perlvar"と "perldoc -f eof" – runrig

+0

を参照してください。ありがとう。 2番目の部分では、「kshスクリプトからネイティブのPerlスクリプトに切り替えた方が、解決しやすいのか、それとももっと論理的なのでしょうか」という質問を見る機会がありましたか? –

3

perl -pi -e 'chomp($prev=$_);s/find/replace/g and print STDERR "$ARGV - $.: $prev -> $_"; close ARGV if eof' $1/*.html 2> logfile.txt 

編集:複数の入力ファイルが

+0

正直言って、私はeofのことを考えて、ここに戻って編集を行い、既にあなたのことを変えたことに気づいた: – runrig

+0

心配なし:) 私はあなたに最初にコメントを追加しました。しかし、私はまだ担当者を持っていない:| – denkfaul

+0

ありがとう、私は今夜それを試してみましょう。 kshスクリプトからネイティブPerlスクリプトに切り替えると、ソリューションが簡単になるか、論理的になりますか? –

関連する問題