VIM 搜索和替换以纠正断行

VIM 搜索和替换以纠正断行

我有一个文件正忙于纠正其中有一些不可靠的换行符,这是一个小例子

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

相关内容