如何处理补丁文件中连续的单独+行,将多行替换为单行?
处理大型补丁文件:合并连续的仅含+的行
针对8万行的大型补丁文件,需要将连续出现的仅包含单个+的行合并为一行,以下是几种可行的实现方案:
一、Sed 命令行方案(批量处理首选)
Sed 适合流式处理大文件,内存占用低,直接执行以下命令即可完成转换:
sed -e '/^\+$/{:loop' -e 'N;/^\n\+$/s/\n\+//' -e 'b loop' -e '}' input.patch > output.patch
逻辑说明:
/^\+$/:精准匹配**仅含单个+**的行(^和$限定行首行尾,\+转义特殊字符+):loop定义循环标签,N读取下一行到模式空间- 如果新模式空间是换行+
+(即下一行也是目标行),则删除换行和多余的+ - 重复循环直到遇到非目标行,最后输出处理后的内容
二、Awk 命令行方案(逻辑直观)
Awk 通过跟踪前一行状态来过滤重复行,命令如下:
awk '{ if ($0 == "+") { if (!prev_plus) { print; prev_plus=1 } } else { print; prev_plus=0 } }' input.patch > output.patch
逻辑说明:
- 用
prev_plus标记前一行是否是目标行 - 遇到目标行时,仅在首次出现时打印;非目标行直接打印并重置标记
三、Vim 交互式方案(适合手动调整)
如果需要交互式处理补丁文件,打开文件后执行以下替换命令:
:%s/\(^+\n\)\+/+\n/g
执行后保存文件:
:w
逻辑说明:
\(^+\n\)\+匹配连续的单个+行(每行仅含+且后跟换行)- 替换为单个
+行,直接完成合并 - 若要处理文件末尾的连续
+行,可调整为::%s/\(^+$\_\n\)\+/+\n/g
内容的提问来源于stack exchange,提问作者amkgi
相关产品推荐
相关产品推荐

