我有一个大文件,正在对其进行各种操作,并且刚刚出现此错误。我尝试用谷歌搜索它,但没有找到任何结果。
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
以对其进行初始化。)