我有大约100000多个文件,其中包含部分损坏的数据、混合文本+二进制文件(一个带有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* ÿì
)
编辑/解决方案:关于100000多个文件,这里有一个版本(关于仅在缓存控制行上缺少^M),只有在缺少^M时才匹配(因为不是所有文件都被损坏,这将与"更新!"一起节省大量时间):
:1,11s/^Cache-Control:.{-}zs(^M*$)(^M)@<!/^M/i
单个命令可能看起来像:v/^M/s/$/^M/
。这使用<C-v><C-m>
,也就是说。。。它插入一个用反斜杠转义的文本^M
字符。