这行命令可以帮助你删除包含 Merge 的 commit 块(任意多个这样的文字块)
sed -n '/commit/{:a;h;n;/Merge/b;:c;H;n;$bd;/commit/!bc;:d;x;p;x;ba}' log > log.txt
运行效果如下:
我的命令可能复杂了些。稍微解释一下,仅供参考:
其中:a :b :c :d 是命令跳转标签label
/commit/{:a;h;n;
当某行找到 commit 时,将此行复制到 hold space,然后读取下一行。
/Merge/b;
如果刚刚读取到的新行,包含Merge,则结束对本行的处理,读取下一行,并继续寻找commit
如果刚刚读取到的新行,不包含Merge,那么继续对本行执行后续命令:
:c;H;n;$bd;/commit/!bc;:d;x;p;x;ba}
将此行追加到hold space,读取下一行,如果没有到最后一行,并且没有找到commit,那么执行命令bc,跳转到c标签——循环这个过程,直到读取到文件末尾或者读取到包含commit的行。然后,x,将hold space的内容与 pattern space的内容对调,p,输出pattern space的内容(即,不包含Merge的块),x,再次对调,pattern space变成之前的内容(文件末尾或者包含commit的行)。ba,跳转到标签a,继续对此行进行检查,重复步骤1,2,3。
如果上面的命令改为:
sed -n '/commit/{:a;h;n;/Merge/!b;:c;H;n;$bd;/commit/!bc;:d;x;p;x;ba}' log > log.txt
那么,输出结果为,只包含 Merge 的 commit 块
删除字符的, 就要使用命令工具sed了, 再配合正则使用, 比如纯字符[A-Zz-a]+
这样可以匹配你想要的字符集, 这个工具也会很强大的啊。
如果以后有遇到Linxu服务器的问题, 或者是是shell编程问题, Linux服务器运维问题, 系统管理, 都可以一起研究一下哦
这个得用脚本来处理了,比如:python。
sed /Merge:/,/Merge/d log > log.txt
sed /awk 估计可以