我正在使用SQLPlus执行sql脚本,但是我有一个错误,因为脚本的某些行超过2000个字符。所以我想用每行的n
替换第 2000 个字符之前的最后一个逗号和空格'
但我不知道该怎么做。
有人有想法吗?
感谢您的帮助,
史蒂夫
此示例应在第一个逗号处拆分很长的行,后跟一个空格以位于>1900
的位置。所有少于 1900 个字符的行将保持不变。
cat file.sql | sed -n 's/^(.{1900}[^,]*,) (.*$)/1n2/gp; /^.{1,1899}$/p'
不过,它不会将任何行拆分为 2 行以上 [例如,如果一行长度为 5000 个字符]。因此,根据您预计最长的行数,尝试连续多次运行[显然,file.sql
被最新运行的输出覆盖......]
编辑:另外,请注意长度超过1900个字符的行的特殊情况,但从字符#1900开始没有任何逗号。这些行(例如" [...~1900 characters of...] comma, seperated, stuff [exceeding position 1900] followed by anything but expected seperator EOL
")只是被上述解决方案完全忽略[甚至没有打印]。但是,对要正确处理的那些进行修改应该很容易。
使用 gawk 4.0,我对 40 个字母进行了测试,您可以根据自己的期望用 2000 替换。
awk '{r=substr($0,41);s=substr($0,1,40);s=gensub(/,([^,]*)$/,"n\1","g",s);print s r}' file
这个想法是,将行分成两个字符串:s
(前 40 个字符)r
(其余),然后在 s 上替换最后,
以返回n
测试文件内容:
hrsjdf,lkjajflkjafkljklfj,asdfadfk,afef=",/foa
jdf,lkjajflkjafkljklfj,asdfadfk,afef=",/foaasdfdf
使用折叠命令来帮助理解您的问题。
$ fold -w40 < file
hrsjdf,lkjajflkjafkljklfj,asdfadfk,afef=
",/foa
jdf,lkjajflkjafkljklfj,asdfadfk,afef=",/
foaasdfdf
所以第一行,我们需要在afef=
之前添加一个返回,第二行应该在/
结果如下:
awk '{r=substr($0,41);s=substr($0,1,40);s=gensub(/,([^,]*)$/,"n\1","g",s);print s r}' file
hrsjdf,lkjajflkjafkljklfj,asdfadfk
afef=",/foa
jdf,lkjajflkjafkljklfj,asdfadfk,afef="
/foaasdfdf
sed ': beg
s/(.{250}){8}/&
/
t long
b
: long
s/^(.*), ([^,]*)(n)/132/
P
s/.*n//
b beg
' YourFile
某些 SED 限制的解决方法,模式缓冲区大小限制为 255 个字符(因此最大 2000 个字符(.{250}){8}
原理:
- 通过添加
n
来剪切线,取最大 2000 个字符的原始行。如果未剪切,请出去(并打印内容) - 找到最后一个
,
并将其替换为结尾n
- 打印缓冲区的第一行
- 删除第一行
- 重新启动进程(直到行低于 2000 个字符)