Vim(7.3.3 Windows 64bit):如果没有,则将^ M添加到行尾(ff = unix)

kil*_*s76 1 windows vi vim eol end-of-line

我有大约100,000多个文件,包含部分损坏的数据,混合文本+二进制文件(带有http标头的jpg图像数据的单个文件),其中一些标题字段具有dos样式^ M ^ J行终止,有些只有unix样式^ J .当vim打开这样的文件时,它会将其视为unix格式.所以所有标题行都没有^ M,需要添加一个.但事实证明这非常艰难.

:1,11s/Cache-Control:.*\zs^M\{0,}$/^M/

不起作用,我已经尝试了各种变体,甚至使用\ = printf("%s","^ M")作为替换字符串.但结果始终是文件中的新空行.

我能够通过命令添加^ M的唯一方法是

:exe "normal A\<c-q>\<c-m>\<Esc>"

好吧,所以一种方法是首先删除任何现有的^ M,然后按之前添加它.但是,有一个更优雅,一个命令解决方案?

(这样就不会有误解了,这里有一个简短的例子:

HTTP/1.1 200 OK
Server: Apache/2.2.3
(more lines...)
Cache-Control: public, max-age=214748
(more lines...)

ÿØÿá Exif  II*            ÿì
Run Code Online (Sandbox Code Playgroud)

)

编辑/解决方案:关于100,000多个文件,这里是一个版本(关于仅在缓存控制行上丢失^ M),只有在缺少^ M时才匹配(因为并非所有文件都被修复,这将节省大量时间和"更新")!

:1,11s/^Cache-Control:.\{-}\zs\(^M*$\)\(^M\)\@<!/\^M/i

Con*_*ner 6

单个命令可能看起来像:v/^M/s/$/\^M/.这使用<C-v><C-m>,也就是说...它插入一个^M用反斜杠转义的文字字符.

  • `:V/^ M/S/$ /\^ M` (2认同)