grep、cut、sed、awk、perlなどの他のストリーム編集およびテキスト処理/操作ツールを使用するときにこれが可能かどうか疑問に思います。出力の反対(つまり、コマンドの実行時に抽出されなかった内容)を一般的な方法で出力(ファイルまたはSTDOUT形式)にする方法はありますか?ツール機能とオプションのロゴを完成させます。
たとえば、
これにより、正規表現に一致するファイルの行が印刷されます。
sed '/regexp/!d
これにより、正規表現と一致しないファイルの行が印刷されます。
sed '/regexp/d'
sedオプションを使用せずに一般的なアプローチを使用してから、awkまたはgrepコマンドに適用してこれらのコマンドのいずれかを実行し、どこかにSTDOUTなしでデータを出力できますか?
これを行い、connを使用してsedコマンドをファイルに出力し、元のファイルを出力ファイルと比較して違いを出力できます。次のようなものです(構文が正しくないと確信していますが、論理が達成可能であることを願っています)。
comm <(sort originalFile) <(sort sedProcessedFile) > originalFileMinussedProcessedFile
ただし、sedだけでなく、あらゆる種類のテキスト/ストリーム操作ツール、または少なくともawkとPerl用です。
答え1
これに対する一般的なアプローチはありません。フィルタはストリームを読み書きするだけで、ストリームを内部で変更せず、フィルタ間の関係は完全に任意であり、特定のツールによって異なります。したがって、一般的なメカニズムは、入力から何かが「削除」されたことを知らないため、出力にコピーするために保存することはできません。
awk
ただし、同じツールはperl
任意のファイル自体に書き込むことができるため、明示的なコードを使用してこれを実行できます。
awk '/regexp/ { print } !/regexp/ { print > "non-matching.txt" }' > matching.txt