替换或删除所有 \n 但不是 \r\n

Replace or remove all \n but not \r\n

我有一个格式不正确的 CSV 文件,每行数据都以回车符 returns (\r\n) 结尾。

但是,一些文本值在逗号之间有换行符 (\n)。这使得读取文件有问题。

在Vim中,如何用“”替换所有单独的“\n”,而不是“\r\n”的一部分?

Vim 中的示例文件外观:

1,a,b,c^M
2,d,e,f^M
3,g
,h,i^M
4,j,k,l

因为我不知道如何使用 non-selection 正则表达式,所以我做了以下操作。

我把所有的"\n"都换成了"":

:%s/\n//

然后将所有的"\g"替换为"^M":

:%s/\g/^M/

其中^M用Ctrl + V, Ctrl + [=20输入=]M

您的回答侧重于替换和 EOL 字符,因此这里是使用相同工具的稍微不同的方法:

:%s/\(\w\)\n/

我们在哪里……

  • 搜索后跟“换行符”的“单词字符”,
  • 抓取单词字符,
  • 最后用捕获替换匹配,有效地删除换行符。

但是替换和 EOL 字符并不是这里唯一可用的角度。我们可以简单地将其视为一个非常简单的线连接问题:

:g/^,/-j!

我们在哪里……

  • 在以逗号开头的每一行上执行一条命令,
  • 命令是:-join!,它将标记行上方的行与标记行连接起来,没有space。

参见 :help :g:help :range:help :join