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

时间:2014-02-19 16:31:53

标签: bash sed

我正在使用SQLPlus执行sql脚本,但是我有一个错误,因为脚本的某些行超过2000个字符。 所以我想在每行上用'替换第2000个字符前的空格\n,但我不知道该怎么做。

有人有想法吗?

感谢您的帮助,

史蒂夫

3 个答案:

答案 0 :(得分:2)

此示例应在第一个逗号分隔非常长的行,然后将空格分隔到位置>1900。所有短于1900个字符的行都将保持不变。

cat file.sql | sed -n 's/^\(.\{1900\}[^,]*,\) \(.*$\)/\1\n\2/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 ”)完全被上述解决方案完全忽略[甚至不打印]。但是,对那些要妥善处理的修改应该很容易。

答案 1 :(得分:0)

使用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来替换最后,以返回{ {1}}

测试文件内容:

\n

使用fold命令帮助理解您的问题。

hrsjdf,lkjajflkjafkljklfj,asdfadfk,afef=",/foa
jdf,lkjajflkjafkljklfj,asdfadfk,afef=",/foaasdfdf

所以第一行,我们需要在$ fold -w40 < file hrsjdf,lkjajflkjafkljklfj,asdfadfk,afef= ",/foa jdf,lkjajflkjafkljklfj,asdfadfk,afef=",/ foaasdfdf 之前添加一个返回,第二行应该在/

之前添加

结果如下:

afef=

答案 2 :(得分:0)

sed ': beg
s/\(.\{250\}\)\{8\}/&\
/
t long
b
: long
s/^\(.*\), \([^,]*\)\(\n\)/\1\3\2/
P
s/.*\n//
b beg
' YourFile

某些SED的限制解决方案,模式缓冲区大小限制为255个字符(因此2000个字符最大值为\(.\{250\}\)\{8\}

普林西:

  • 通过添加\n来切割线来获取max 2000 char的原始行。如果没有剪切,请外出(并打印内容)
  • 找到最后一个,并将其替换为结尾\n
  • 打印缓冲区的第一行
  • 删除第一行
  • 重启进程(直到行数低于2000个字符)