リバースマッチライン、NULで区切られた

リバースマッチライン、NULで区切られた

ファイルのマッチングを処理するコンテンツを作成していますが、リバース操作が必要です。ファイルリスト(例:from find . -type f -print0 | sort -z >lst)と一致リスト(例:from grep -z foo lst >matches- 注)これは単なる例であり、任意のmatchesサブセット(空白または全体を含む)またはlst)にすることができます。これを元に戻したいです。

背景:私は次のようなものを実装しています。検索(1)例外ファイルリスト(このリストは事前にフィルタリングできますが、呼び出し時にファイルシステムにファイルが存在します)ファイルリストがそれほど大きくない場合は使用できますが、自分find "${files[@]}" -maxdepth 0 -somecondition -print0が書いている内容を適切に使用してもLinuxまたはBSDのargvサイズ制限を超えます。 。

行がNULで区切られていない場合は、を使用できますcomm -23 lst matches >inverted。一致がNULで区切られていない場合は、を使用できますgrep -Fvxzf matches lst。ただし、最初の段落で述べたジェネレータでは両方です。

GNUツールがインストールされていると仮定すると、これはDebianの外部に移植する必要はありません。私が使っていて友達がすでに持っているからfind -print0ですsort -z。文句を言わないでください)。

ここでもコードを再利用しようとしています。comm -23入力行の区切り文字の変更を(まだ)サポートしていないことを除いて、基本的にはすでに完璧なツールです。コミュニケーションそれにもかかわらず、過小評価され、よく知られていないツールです。 Unix / Linuxツールボックスが合理的な機能を提供していない場合は、シェルでcomm -23フォームを再実装できます(このユースケースに合わせて単純化)。なぜなら、スクリプトはすでに(他の理由で)read -d ''入力時にNUL区切り文字をサポートするシェルを必要とするからです。しかし、それは遅いでしょう(そしてそれは難しいです...明日または28日にいつそれを取るのか誰かを知りたいのですが、仕事の終わりにこの記事を投稿します)。

ベストアンサー1

テキスト以外の入力をサポートしている場合comm(GNUツールが通常行っているように)、常にNULとnlを置き換えることができます(ここではプロセス置換をサポートするシェルを使用します(btw、mkshにはどのような計画がありますか?)) 。

comm -23 <(tr '\0\n' '\n\0' < file1) <(tr '\0\n' '\n\0' < file2) |
  tr '\0\n' '\n\0'

それは一般的に使用される技術

おすすめ記事