我有一个文件正忙于纠正其中有一些不可靠的换行符,这是一个小例子
Row ('Row 01') Property ('Property 01')
Row ('Row 02') Property ('Property
02')
Row ('Row 03') Property ('Property 03')
因此,第二行的属性值中有一个换行符,它应该只是像第一行和最后一行一样的一行。
我可以通过在 VIM 中执行以下操作来纠正它
Remove all Line Breaks everywhere
:%s/\n/ /g
这给了我
Row ('Row 01') Property ('Property 01') Row ('Row 02') Property ('Property 02') Row ('Row 03') Property ('Property 03')
然后
Reinsert new Line Breaks only where they are wanted
:%s/ Row/\rRow/g
这给出了我想要的数据
Row ('Row 01') Property ('Property 01')
Row ('Row 02') Property ('Property 02')
Row ('Row 03') Property ('Property 03')
问题在于,在具有数千行的文件上无法删除每个换行符,因为它非常慢。
我想知道是否没有更好的 VIM 搜索和替换方法来处理这个问题,而无需最初将所有内容折叠成一行
答案1
gg!Gperl -0 -p -e 's/\n/ /mg; s/ Row/\nRow/mg; s/ \Z/\n/'<enter>
- gg - 转到文件开头
- !G 从当前 pos 到文件末尾的管道通过:
perl -0 -p -e '....'
vim
用 perl 脚本的输出替换整个缓冲区。它永远不会看到中间阶段(没有换行符),也永远不必处理荒谬的长行。
最后的语句s/ \Z/\n
替换了空格在文件末尾(由第一条语句从 a 转换\n
),以便它再次成为一个正确的文本文件(即最后一行以换行符结尾),没有更改可能紧邻换行符之前的任何其他空格。或者,您可以转到文件末尾并手动添加换行符。
更好的是,在vi
.保存并退出,然后从 shell 运行:
perl -i.bak -0 -p -e 's/\n/ /mg; s/ Row/\nRow/mg; s/ \Z/\n/' filename.txt
这将“就地”修改文件并保留原始文件的备份副本,文件名“扩展名”为.bak