我正在尝试修复一个数据文件,所以我可以使用MySQL data LOAD INFILE导入数据到数据库。
我对文件的问题是,有冗长的文本,但它包含在文本中的新行。另外,一条新线意味着新的记录。这使得我很难将记录导入MySQL。
如何在linux中使用vim来搜索非法的新行并将其替换为空格?
非法的新行:如果在逗号(,)和(,012d000)之间发现新行
这是文件
的一个示例数据VST-65654,a0Jd000000FM8cBEAT,Blah,2013-10-22 10:46:30.000000,Blah Blah,2014-01-20 20:27:42.000000,2013-10-18 14:00:00.000000,005d0000002biR4AAI,001d000001NEh0oAAD,In Person,Unscheduled,Grow Applications,High,this is the body
of this
log test
where I need to
remove all extra new lines,012d0000000ppiXAAQ
VST-122549,a0Jd000000GVwtyEAD,Blah,2013-10-31 18:17:50.000000,Blah,2013-11-06 18:07:47.000000,2013-10-31 18:10:00.000000,005d0000002biR9AAI,001d000001NEaQgAAL,In Person,Scheduled,Grow Applications,Medium,One more long paragraph
where I need to remove all extra
new lines
,012d0000000ppiABCD
字段由逗号(,)分隔,当发现新行n时,新记录应该开始。我如何做这样的搜索替换来解决这个问题?
或者如何用双引号替换所有未转义的逗号?也就是说,如果我找到,不要碰它,但如果你找到逗号用","代替
谢谢
g/^VST/,-/,012d000/j!
使用全局命令,:g
, :j
,以VST
开头的行与下一个012d000
实例的所有行连接在一起。
更多帮助参见:
:h :g
:h :j
:h [range]
我的regex foo不够强大,不能在一个命令中做到这一点,但您可以创建一个宏来实现您想要的。以下内容适用于您提供的输入
转到文件开始
gg
开始记录
qq
查找下一个,012d
/,012d<CR>
上一行
k
进入可视模式
v
转到前面的逗号
?,<CR>
替换所有新行字符
:s/n//g<CR>
往下一行
j
完成记录
q
重复@q
结果VST-65654,a0Jd000000FM8cBEAT,Blah,2013-10-22 10:46:30.000000,Blah Blah,2014-01-20 20:27:42.000000,2013-10-18 14:00:00.000000,005d0000002biR4AAI,001d000001NEh0oAAD,In Person,Unscheduled,Grow Applications,High,this is the body of this log test where I need to remove all extra new lines,012d0000000ppiXAAQ
VST-122549,a0Jd000000GVwtyEAD,Blah,2013-10-31 18:17:50.000000,Blah,2013-11-06 18:07:47.000000,2013-10-31 18:10:00.000000,005d0000002biR9AAI,001d000001NEaQgAAL,In Person,Scheduled,Grow Applications,Medium,One more long paragraph where I need to remove all extra new lines ,012d0000000ppiABCD
我喜欢peter Rincker的回答。至于您最后问的问题,您可以使用
用","
替换所有未转义的逗号。:%s/\@<!,/","/g
这里,\
代表一个字面反斜杠,@<!
是一个修饰符。(参见:help /@<!
.)
这个解决方案的问题是您没有正确定义什么是未转义逗号。例如,\,
是一个转义的反斜杠后跟一个未转义的逗号。我相信/\@<!%(\\)*zs,/
是正确的图案,但我并没有说它漂亮。如果您使用"非常神奇"的版本:/v\@<!%(\\)*zs,/
.