非常に長い行を含むテキストファイルを操作できない最新のUnixシリーズオペレーティングシステムにシェルユーティリティがありますか?

非常に長い行を含むテキストファイルを操作できない最新のUnixシリーズオペレーティングシステムにシェルユーティリティがありますか?

LINE_MAXを実行して取得できる値ですgetconf LINE_MAX。 FreeBSD 12とUbuntu 18.04(そして他の多くのオペレーティングシステムも疑われます)では、値は2048バイトです。

POSIXの世界には、テキストファイルを扱うために特別に設計されたシェルユーティリティがたくさんあります。改行を含むバイトより長い行を持つファイルはLINE_MAXテキストファイルではありません(とにかくPOSIXで定義されているように)。テキストファイルを入力として使用するように設計されたシェルユーティリティは、これらのファイルを正しく処理する必要はありません。

実際、非常に長い行を含むテキストファイルを処理できないユーティリティが見つからないようです。私が知る限り、GNUユーティリティにはテキストファイルの行長に実際の制限はありません(FreeBSDについてはわかりません)。

LINE_MAXバイトより長い行をブロックする現代または準現代のオペレーティングシステムのシェルユーティリティを知っている人はいますか?しかし、PerlやPythonなどのプログラミング言語もその値の影響を受けますかLINE_MAX

答え1

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

より長い行を使用するユーティリティを完全に拒否することに加えて、潜在的に望ましくない動作につながる共通のパターンがあります。

fgets(line, sizeof line, fp);

where lineis LINE_MAX- サイズの文字配列(例を参照)pam_localuser)。line処理するたびにfgetsnon-が返された場合、行が長すぎるとNULL入力LINE_MAXが分割されます。したがって、pam_localuser/etc/passwdさが1より大きい行はLINE_MAX2行として扱われます。

私が見たプログラミング言語とパーサジェネレータには参照がありませんLINE_MAX(その言語で書かれたプログラムで値を使用できるように渡すことに加えて)。これには、GCC、Perl、Python、Luaが含まれます。

関連情報