1

我有大约 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*            ÿì

)

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

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

4

1 回答 1

6

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

于 2012-07-27T14:02:59.970 回答