如何用sed编写两个脚本分别提取第2个* i开头行的前后内容
解决提取第二个
* i开头行前后内容的sed脚本问题 我明白你之前的脚本只能处理第一个匹配行,现在给你两个精准的sed脚本,分别实现你的需求:
1. 提取第二个* i开头行之前的所有内容(不含该行)
这个脚本会遍历文件,计数匹配到的* i行,当遇到第二个匹配行时立即停止输出,确保只保留该行之前的所有内容:
sed -n ' /^\* i/{ x s/^/1/ /11/{q} x } p' your_input_file.txt
工作原理:
-n让sed默认不输出任何行,只在我们指定时打印- 每遇到以
* i开头的行,就交换模式空间(当前行内容)和保持空间(临时存储区) - 在保持空间里追加一个
1,用来计数匹配次数 - 当保持空间里出现
11(说明是第二次匹配),就用q命令退出sed,停止处理后续内容 - 其他行都通过
p命令正常打印
2. 提取第二个* i开头行及之后的所有内容
这个脚本会跳过前两个匹配行之前的内容,从第二个匹配行开始,打印所有后续内容:
sed ' /^\* i/{ x s/^/1/ /11/{:loop; p; n; b loop} x } d' your_input_file.txt
工作原理:
- 同样用保持空间里的
1计数匹配次数 - 当检测到第二次匹配(保持空间为
11),就进入循环:打印当前行,读取下一行,继续打印,直到文件结束 - 所有未触发第二次匹配的行,都用
d命令删除,不输出
测试示例
假设你的输入文件内容如下:
普通行1 * i 匹配行1 普通行2 * i 匹配行2 普通行3 普通行4
- 第一个脚本输出:
普通行1 * i 匹配行1 普通行2 - 第二个脚本输出:
* i 匹配行2 普通行3 普通行4
内容的提问来源于stack exchange,提问作者stacko
相关产品推荐
相关产品推荐

