sed:正規表現の入力バッファ長がINT_MAXより長くなります。

sed:正規表現の入力バッファ長がINT_MAXより長くなります。

さまざまなタスクを実行する大容量ファイルがありますが、このエラーが発生しました。インターネットを検索しようとしましたが、結果が見つかりませんでした。

sed: regex input buffer length larger than INT_MAX

私の意図は、各行を引用してカンマを追加してから、ファイル全体を(一行で)角括弧で囲むことです。たとえば、次のように入力します。

The quick brown fox
jumps over
the lazy dog.

次の結果を生成する必要があります

["The quick brown fox","jumps over","the lazy dog.",]

入力ファイルには引用符が含まれていないと想定されます。

私が実行するコードは次のとおりです。

cat "${FILE}" | sed -e 's/.*/"&",/' | sponge "${FILE}"

truncate --size=-1 "${FILE}"

cat "${FILE}" |  sed -z 's/.*/[&]/' | tr --delete '\n' | sponge "${FILE}"

sed バージョン:

sed --version
sed (GNU sed) 4.5

どんなアイデアがありますか?

ベストアンサー1

あなたの質問は奇妙です。 「...このエラーはちょうど現れました。インターネットを検索しようとしましたが、結果が見つかりませんでした」と言うと、何が起こっているのかわからないようです。しかし、あなたは理解していませんか?と言うと、読み取り入力にNULを改行文字ではなくレコード(行)区切り文字として扱うようにsed -z指示します。sedただし、テキストファイルには通常NUL文字が含まれていないため、実際にはファイル全体をsed読み取って1行で処理する必要があります。あなたは明らかにこれを理解しています。's/.*/[&]/'ファイル全体を 1 行で処理したくない限り、「ファイル全体を角かっこで囲む」というコマンドは意味がありません。

それでは、大容量ファイルが大きすぎて1行で処理できないという事実に、なぜそんなに驚いたのですか?

あなたはスクリプトが時々動作すると言った。それはおそらく、ファイルサイズが次のとおりですsed。このスクリプトは、ファイルサイズに関係なく同じことを行う必要があります。

cat "$FILE" | sed -e 's/.*/"&",/' -e '1s/^/[/' -e '$s/$/]/' | tr --delete '\n'

もちろん誰かがこうすれば、まだ息が詰まるだろう。ワイヤー入力内容が長すぎます。

メモ:

  • {その必要はありません}"$FILE"大丈夫です。
  • 次のようなSteeldriverの提案[最初の行の先頭に a を挿入し、]最後の行の最後に a を追加します。
  • sponge説明の便宜のために省略した。入力ファイルを上書きするのは運用上必要ですが、デバッグ中にそれを行うのは悪いことです。spongeコマンドが必要に応じて実行されていることを確認したら、もう一度追加してください。

これによりスクリプトが複製されるため、次のように入力します。

The quick brown fox
jumps over
the lazy dog.

次の結果が生成されます。

["The quick brown fox","jumps over","the lazy dog.",]

前にカンマを追加してください]。本当に欲しいものがあれば元気です。末尾にカンマを追加したくない場合は、次のようにします。

cat "$FILE" | sed -e 's/.*/"&",/' -e '1s/^/[/' -e '$s/,$/]/' | tr --delete '\n'

コマンド'$s/,$/]/'が追加されます]

さらに、これまでに説明したすべてのコマンドは改行なしでファイルを残します。 結局一人もいませんでした。  これは無効なテキストファイルであり、一部のコマンドは正しく処理できません。本当に欲しいものがあれば元気です。それ以外の場合は追加します。

echo >> "$FILE"

または

printf '\n' >> "$FILE"

スクリプトの最後に。

おすすめ記事