sed
ある式に従ってフィルターの一致する行を作成し、一致しない行を印刷せずに無視するにはどうすればよいですか?
実際の例として、私scalac
は一連のファイルで(Scalaコンパイラーを)実行し、その-verbose
出力から.class
作成されたファイルを読み取ります。scalac -verbose
たくさんのメッセージを出力しますが、私たちはフォームのメッセージにのみ興味があります[wrote some-class-name.class]
。私が現在やっていることはこれです(|&
stashrを次のプログラムにパイプするためのbash 4.0の方法です):
$ scalac -verbose some-file.scala ... |& sed 's/^\[wrote \(.*\.class\)\]$/\1/'
これにより、対象のメッセージからファイル名が抽出されますが、他のすべてのメッセージは変更されずに通過します。もちろん、代わりにこれを行うことができます:
$ scalac -verbose some-file.scala ... |& grep '^\[wrote .*\.class\]$' |
sed 's/^\[wrote \(.*\.class\)\]$/\1/'
これは機能しますが、実際の問題を回避するのとよく似てsed
います。つまり、入力から一致しない行を無視するように指示する方法です。それでは、どうすればよいでしょうか。