sed:正则表达式输入缓冲区长度大于 INT_MAX

Chr*_*ris -1 scripting sed text-processing regular-expression

我有一个大文件,正在对其进行各种操作,并且刚刚出现此错误。我尝试用谷歌搜索它,但没有找到任何结果。

\n\n
sed: regex input buffer length larger than INT_MAX\n
Run Code Online (Sandbox Code Playgroud)\n\n

我的目的是引用每一行,附加一个逗号,\n然后用方括号将整个文件括起来\n(作为一行)。\xc2\xa0\n例如,输入

\n\n
The quick brown fox\njumps over\nthe lazy dog.\n
Run Code Online (Sandbox Code Playgroud)\n\n

应该产生以下结果

\n\n
["The quick brown fox","jumps over","the lazy dog.",]\n
Run Code Online (Sandbox Code Playgroud)\n\n

假设输入文件\xe2\x80\x99t 不包含任何引号。

\n\n

我运行的代码是这样的:

\n\n
cat "${FILE}" | sed -e \'s/.*/"&",/\' | sponge "${FILE}"\n\ntruncate --size=-1 "${FILE}"\n\ncat "${FILE}" |  sed -z \'s/.*/[&]/\' | tr --delete \'\\n\' | sponge "${FILE}"\n
Run Code Online (Sandbox Code Playgroud)\n\n

sed版本:

\n\n
sed --version\nsed (GNU sed) 4.5\n
Run Code Online (Sandbox Code Playgroud)\n\n

有什么想法吗?

\n

G-M*_*ca' 5

你的问题很奇怪。\xc2\xa0\n你说\xe2\x80\x9c\xe2\x80\xa6\xc2\xa0这个错误刚刚出现。\xc2\xa0\n我尝试谷歌搜索但没有找到任何错误结果就是这样。\xe2\x80\x9d,\n听起来好像你不知道\xe2\x80\x99发生了什么。\xc2\xa0\n但你确实理解它,\xe2\x80\x99不是吗?\ xc2\xa0\n当你说 时sed\xc2\xa0-z,\xe2\x80\x99 告诉你sed读取输入,\n将 NUL 视为记录(行)分隔符而不是换行符。\xc2\xa0\n但文本文件通常不\xe2\x80\x99t其中有NUL字符,\n所以,实际上,\n这意味着你想sed读取整个文件\n并将其视为一行。\xc2\xa0\n你显然明白这一点;你的\'s/.*/[&]/\'命令\n\n\n\n用方括号关闭整个文件\xe2\x80\x9d,\n\n\xe2\x80\x99t 有意义,除非您希望将整个文件\n视为单线。

\n\n

那么,为什么您对您的大文件太大而无法作为一行进行处理感到如此惊讶呢?

\n\n

你说你的脚本有时会工作 \xe2\x80\x94\n大概当文件大小低于 允许的最大行大小时sed。\xc2\xa0\n这个脚本应该做同样的事情,无论文件大小如何文件:

\n\n
cat "$FILE" | sed -e \'s/.*/"&",/\' -e \'1s/^/[/\' -e \'$s/$/]/\' | tr --delete \'\\n\'\n
Run Code Online (Sandbox Code Playgroud)\n\n

当然,如果有任何单独的线路,这仍然会令人窒息长得荒谬,这仍然可能会令人窒息。

\n\n

笔记:

\n\n
    \n
  • 您不需要\xe2\x80\x99t{};"$FILE"很好。
  • \n
  • 按照Steeldriver 提出的建议,\n这会[在第一行的开头插入一个\n并附加一个]在最后一行的末尾附加 a。
  • \n
  • 为了便于说明,我省略了sponge。\xc2\xa0\n覆盖您的输入文件可能在操作上是必要的,\n但是当您\xe2\x80\x99 仍在调试时,\xe2\x80\x99 是一件坏事。\xc2\ xa0\n添加sponge当您\xe2\x80\x99 确定\xe2\x80\x99 正在执行您想要的操作时,将命令添加回来。
  • \n
\n\n

这会重复您的脚本,因此输入

\n\n
The quick brown fox\njumps over\nthe lazy dog.\n
Run Code Online (Sandbox Code Playgroud)\n\n

将产生以下结果

\n\n
["The quick brown fox","jumps over","the lazy dog.",]\n
Run Code Online (Sandbox Code Playgroud)\n\n

之前多加一个逗号].\xc2\xa0\nIf that\xe2\x80\x99s 确实是你想要的,好吧,that\xe2\x80\x99s 适合我。\xc2\xa0\n如果你不\xe2\x80 \x99t 想要末尾的逗号,做

\n\n
cat "$FILE" | sed -e \'s/.*/"&",/\' -e \'1s/^/[/\' -e \'$s/,$/]/\' | tr --delete \'\\n\'\n
Run Code Online (Sandbox Code Playgroud)\n\n

其中\'$s/,$/]/\'命令\n在附加以下内容时删除文件末尾的逗号].

\n\n

另请注意,到目前为止讨论的所有命令\n都会给您留下一个没有换行符的文件,\n甚至结尾处都没有换行符\xc2\xa0\n这是一个格式错误的文本文件,\n有些命令无法正确处理它。\xc2\xa0\n如果\xe2\x80\x99s确实是你想要的,那么,\xe2\x80\x99s我没问题。\xc2\xa0\n否则,添加

\n\n
echo >> "$FILE"\n
Run Code Online (Sandbox Code Playgroud)\n\n

或者

\n\n
printf \'\\n\' >> "$FILE"\n
Run Code Online (Sandbox Code Playgroud)\n\n

在脚本的末尾。

\n