1. ホーム
  2. sed

[解決済み] sed にマッチしない行を無視させる

2022-10-30 02:42:20

質問

どのようにすれば sed がマッチする行をある式に従ってフィルタリングし、 マッチしない行は印刷させずに無視するようにするにはどうしたらよいでしょうか?

実際の例として、私は次のように実行したいです。 scalac (Scala コンパイラ) をファイルの集合に対して実行し,その -verbose を出力します。 .class のファイルが作成されます。 scalac -verbose はたくさんのメッセージを出力しますが、私たちが関心を持つのは、以下の形式のものだけです。 [wrote some-class-name.class] . 現在私がやっているのは、このようなものです ( |& は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 に、入力からマッチしない行を無視するように指示する方法です。では、どうすればいいのでしょうか?

どのように解決するのか?

プレーンセッドによる別の方法です。

sed -e 's/.../.../;t;d'

s/// は代入です。 t は条件付きで以下の全てのコマンドをスキップする。 d は行を削除します。

perlやgrepは必要ありません。

(Nicholas Rileyの提案を受けて編集)