Sed 替换行中第 2000 个字符之前的最后", "



我正在使用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 个字符)

相关内容

  • 没有找到相关文章

最新更新