現代の Unix 系オペレーティング システムには、非常に長い行を持つテキスト ファイルを操作できないシェル ユーティリティはありますか?

現代の Unix 系オペレーティング システムには、非常に長い行を持つテキスト ファイルを操作できないシェル ユーティリティはありますか?

LINE_MAXを実行するとの値を取得できますgetconf LINE_MAX。FreeBSD 12 および Ubuntu 18.04 (おそらく他の多くの OS でも) では、この値は 2048 バイトです。

POSIX の世界には、テキスト ファイルの操作に特化したシェル ユーティリティが多数あります。1 行のLINE_MAX長さがバイト (改行を含む) を超えるファイルは、テキスト ファイルではありません (POSIX の定義による)。テキスト ファイルを入力として受け取るように設計されたシェル ユーティリティは、この種のファイルを適切に処理できる必要はありません。

実際には、非常に長い行を持つテキスト ファイルを処理できないユーティリティを見つけることはできないようです。GNU ユーティリティには、テキスト ファイルの行の長さに関する実際の制限はないと私は理解しています (FreeBSD についてはよくわかりません)。

長さがバイトを超える行を処理する、最新または比較的新しいオペレーティング システム上のシェル ユーティリティを知っている人はいますかLINE_MAX? 余談ですが、Perl や Python などのプログラミング言語は の値の影響を受けますかLINE_MAX?

答え1

LINE_MAXこのサイトには、少なくともいくつかの状況では、に固執するシェルユーティリティの例が少なくとも1つあります。オープンBSDcut; そうではありませんむせさせるそれより長い行でも実行できますが、一部の機能は行LINE_MAXの最初の文字に制限されます。

長い行の処理を完全に拒否するユーティリティに加えて、潜在的に望ましくない動作を引き起こす一般的なパターンがあります。入力は多くの場合、

fgets(line, sizeof line, fp);

ここで はサイズの文字配列lineですLINE_MAX(例えばpam_localuser)。lineが を 処理するたびに がfgets以外を返す場合、入力は で行が長すぎる場合にNULLで分割されて処理されます。したがって では、よりも長い の行は2 行として処理されます。LINE_MAXpam_localuser/etc/passwdLINE_MAX

私が調べたプログラミング言語とパーサー ジェネレーターには、参照がありませんLINE_MAX(それらの言語で記述されたプログラムで値を利用できるようにするためのパススルー参照を除く)。これには、GCC、Perl、Python、および Lua が含まれます。

関連情報