![在分隔符处分割长 SQL 表达式](https://linux22.com/image/182075/%E5%9C%A8%E5%88%86%E9%9A%94%E7%AC%A6%E5%A4%84%E5%88%86%E5%89%B2%E9%95%BF%20SQL%20%E8%A1%A8%E8%BE%BE%E5%BC%8F.png)
语境
我正在尝试使用 SQL*Plus 导入包含一些长行(8k+ 字符)的转储,因此我面临错误SP2-0027: Input is too long (> 2499 characters)
。这是一个硬编码限制,无法克服。
预期解决方案
我想在 bash 中流式传输输入,并在最后一个,
(逗号)字符上分割比预期宽度长的行。
所以我应该有类似的东西
cat my_dump.sql | *magic_command* | sqlplus system/oracle@xe
细节
- 我知道较新的版本可以接受最多 4999 个字符的行,但我的行仍然更长 (
grep '.\{5000\}' my_dump.sql | wc -l
) - 手动更新转储实际上不太可行
- 我确实尝试过使用,
tr
但这分割了我不想要的每一行 - 我确实尝试使用
fmt
andfold
但似乎不可能使用自定义分隔符 - 我目前正在查看,
sed
但我似乎无法找出一个正则表达式“,
如果字符超过 2500 个,则在前 2500 个字符中查找最后一个匹配项”
答案1
尝试类似的方法:
sed -re '/.{2500}/ s/.{,2500},/&\n/g'
解释:
/.{2500}/
如果行包含 2500 个字符(或更多)...s/.{,2500},/&\n/g
替换最多 2500 个字符,然后,
添加换行符
如果这取代了一些不可替代的“,”,我不会感到惊讶......
答案2
我想像这样的 awk 命令会起作用:
awk 'length > 2499 {gsub(/.{0,2498},/, "&\n")} 1'
正则表达式允许逗号前最多包含 2498 个字符(因此包括逗号在内为 2499 个字符),并在其后插入换行符。 (我使用了 2499,因为错误消息提到了该数字。)