【发布时间】:2017-06-27 07:02:36
【问题描述】:
我有带有 CRLF 行终止符的 textfile。该文件包含两行文本(在 Vim 中显示):
假设我想找到模式foo 并将整行替换为goo,所以我运行:
sed -i 's/foo.*/goo/' textfile
textfile 操作后在 Vim 中显示如下:
我的问题是:为什么之前隐藏的回车在 Vim 中变得可见?
【问题讨论】:
我有带有 CRLF 行终止符的 textfile。该文件包含两行文本(在 Vim 中显示):
假设我想找到模式foo 并将整行替换为goo,所以我运行:
sed -i 's/foo.*/goo/' textfile
textfile 操作后在 Vim 中显示如下:
我的问题是:为什么之前隐藏的回车在 Vim 中变得可见?
【问题讨论】:
命令:
sed -i 's/foo.*/goo/' textfile
从行尾删除了\r,因为\r 只是UNIX 上sed 的任意字符,与.* 匹配。
看起来 Vim 足够聪明,只要在文件中一致地使用,就不会显示 ^M for Windows 样式的回车符。由于上述 sed 命令,它们不再一致使用,因为它只会从匹配 foo.* 的行中删除 \r。
如果这对您有问题,我建议您使用:
sed -i 's/foo.*/goo\r/' textfile
sydill's comment 将我指向描述此行为的正确手册部分::help file-formats:
... 如果您开始编辑一个新文件并且 'fileformats' 选项不为空 (这是默认设置),Vim 会尝试检测文件中的行 由指定的格式分隔。当设置为 "unix,dos" 时,Vim 将 检查带有单个(在 Unix 和 Amiga 上使用)或通过 对(MS-DOS)。只有当 ALL 行以 结尾时,才设置 'fileformat' 为“dos”,否则设置为“unix”。当 'fileformats' 包含 "mac" 时, 并且在文件中找不到字符,'fileformat' 设置为“mac”。 ...
【讨论】:
:h file-formats 中有一个有用的段落我也会添加到这个答案中(如果你开始编辑......只有当所有行以