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

你的问题很奇怪。你说“……这个错误刚刚出现。我尝试用谷歌搜索,但没有找到任何结果。”,听起来好像你不知道发生了什么。但你确实明白,不是吗?当您说 时sed -z,您是在告诉sed读取输入,将 NUL 视为记录(行)分隔符而不是换行符。但文本文件中通常不包含 NUL 字符,因此,实际上,这意味着您想要sed读取整个文件并将其视为一行。你显然明白这一点;您的's/.*/[&]/'命令“用方括号将整个文件括起来”没有意义,除非您希望将整个文件视为一行。

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

您说您的脚本有时会起作用 - 大概是当文件大小低于sed.无论文件大小如何,此脚本都应该执行相同的操作:

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

当然,如果有人的话,这仍然会令人窒息线输入中的内容太长了。

笔记:

  • 你不需要{and };"$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 可以做到这一点,恕我直言,更清楚一点:

编辑:原始方法(由 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以对其进行初始化。)

相关内容