さまざまなタスクを実行する大容量ファイルがありますが、このエラーが発生しました。インターネットを検索しようとしましたが、結果が見つかりませんでした。
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"
スクリプトの最後に。
答え2
sedが必要ない場合は、awkでトリックを実行できます。 IMHOはもう少し明確です。
編集:元の方法(G-Man、tnxによって変更されました)、最後の文字列の後にコンマ付きのQの出力例を見て、それに基づいていました。
awk <"$FILE" -vORS= -vq=\" 'BEGIN{print "["} {print q $0 q ","} END{print "]\n"}' | sponge "$FILE"
- G-Manが言ったように、
sponge
このデバッグ部分を維持してください - 最後に改行文字が必要ない場合は省略してください。
\n
追加:最後のカンマを削除し、要求に応じて括弧を追加するようにメソッドを変更します。
awk <"$FILE" -vORS= -vq=\" 'BEGIN{print "["} {print sep q $0 q; sep=","} END{print "]\n"}' | sponge "$FILE"
(awkでは、文字列コンテキストの初期化されていない変数は空の文字列を生成することが保証されていますが、初期化するためにオプションまたは-vsep=
ブロックに明示的に追加したい場合);sep=""
BEGIN