2016-12-16 15 views
1

私のmakefileから、ファイルパス、ファイル名、行番号、エラーメッセージを含むメッセージを返すperlスクリプトを呼び出しました。私はファイルパスとファイル名だけが必要です。私のスクリプトはこのメッセージをstdoutに出力し、自動的にコンソールに表示されます。シェル内の警告メッセージから部分文字列を取り出す方法

私のメイクファイルでは、どのようにファイルパスとファイル名を取得できますか?私はgrep、sedまたはteeを使用するか、またはどちらを使うのが最も適しているかについては公開しています。

私の文字列は、このです:

Warning: <filepath>/<filename>: <line number> <some message> 

例えば:

Warning temp/output/dir/report.txt: 545 problem with parsing blah blah blah. 

だから、私は唯一の "TEMP /出力/ DIR/REPORT.TXT" の部分を取得する必要があります。これを行う最善の方法は何ですか?

+1

なぜ「メイクファイル」で違いがあると思いますか? Makefileのコマンドは、シェルによって実行されます。コマンドラインと同じように出力をフィルタリングします。 "Makefile"部分全体を削除するように質問をよく言い直してください。個人的に、私は 'perlscript | – DevSolar

+0

@chris yo: – Inian

答えて

3

最も簡単な方法は、シェルの位置パラメータとパラメータ拡張を使用することです。 Viz:

$ set -- $(echo Warning: temp/output/dir/report.txt: 545 problem ...) 
echo $2 
temp/output/dir/report.txt: 
$ echo ${2%:}  # Remove colon at the right 
temp/output/dir/report.txt 

これは完全にPOSIXyであり、いかなるbashismsにも依存しません。抽出するためのメッセージがstdoutではなくstderrになった場合、あなたのケースでは、

$ set -- $(script); echo ${2%:} 

または可能性

$ set -- $(script 2>&1); echo ${2%:} 

を使用します。これらのすべては、メッセージが最初の行であると仮定します。この仮定が偽であれば、 '警告:'文字列のためのgrepとそれは動作するはずです。

+0

以下の提供されたソリューションに関するフィードバックを、純粋な 'POSIX 'の方法のために'^'与えることができますか?このようなスタイルが存在するかどうか知りませんでした!レッスンは学んだ! – Inian

+0

@Inianあなたのスポーツマンシップのおかげで、仲間HAL9000 :-) – Jens

+0

「$(スクリプト2>&1)」の部分はコマンド置換権と同じですか? – Inian

関連する問題