linux下如何获得特定字符串前后几行文本

2025-03-20 07:28:28
推荐回答(5个)
回答1:

这行命令可以帮助你删除包含 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

  1. /commit/{:a;h;n;

    当某行找到 commit 时,将此行复制到 hold space,然后读取下一行。

  2. /Merge/b;

    如果刚刚读取到的新行,包含Merge,则结束对本行的处理,读取下一行,并继续寻找commit

    如果刚刚读取到的新行,不包含Merge,那么继续对本行执行后续命令:

  3. :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 块

回答2:

删除字符的, 就要使用命令工具sed了, 再配合正则使用, 比如纯字符[A-Zz-a]+
这样可以匹配你想要的字符集, 这个工具也会很强大的啊。
如果以后有遇到Linxu服务器的问题, 或者是是shell编程问题, Linux服务器运维问题, 系统管理, 都可以一起研究一下哦

回答3:

这个得用脚本来处理了,比如:python。

回答4:

sed /Merge:/,/Merge/d log > log.txt

回答5:

sed /awk 估计可以