如何使用sed选取匹配指定模式的行及其紧邻的下一行?
sed 选取匹配行及紧邻下一行的实现方案
需求1:选取所有包含 tag="foo" 的行及其紧邻下一行
实现命令
sed -n '/tag="foo"/{p;n;p}' 你的目标文件
命令解释
-n参数:关闭sed的默认输出行为,只有手动指定打印的内容才会输出- 匹配到包含
tag="foo"的行时,执行大括号内的操作:p:打印当前匹配到的行n:读取下一行内容到模式空间p:打印刚刚读取的下一行
效果示例
假设测试文件内容如下:
行1:普通测试行
行2:这里包含 tag="foo" 标记
行3:是tag匹配行的下一行
行4:无匹配的普通行
行5:这里也有 tag="foo" 标记
行6:是第二组匹配的下一行
行7:其他无关行
执行命令后输出内容为:
行2:这里包含 tag="foo" 标记
行3:是tag匹配行的下一行
行5:这里也有 tag="foo" 标记
行6:是第二组匹配的下一行
需求2:选取包含 tag="foo" 或者 group="bar" 的行,及各自的紧邻下一行
实现命令
只需要在匹配规则中增加或逻辑即可,有两种写法可选:
- 兼容大部分sed版本的写法:
sed -n '/tag="foo"\|group="bar"/{p;n;p}' 你的目标文件
- GNU sed 可使用扩展正则减少转义:
sed -nr '/tag="foo"|group="bar"/{p;n;p}' 你的目标文件
效果示例
假设测试文件内容如下:
行1:包含 group="bar" 分组标记
行2:是group匹配行的下一行
行3:普通测试行
行4:包含 tag="foo" 标记
行5:是tag匹配行的下一行
行6:无匹配的普通行
执行命令后输出内容为:
行1:包含 group="bar" 分组标记
行2:是group匹配行的下一行
行4:包含 tag="foo" 标记
行5:是tag匹配行的下一行
注意事项
如果匹配到的行是文件的最后一行,没有后续的下一行,则只会输出匹配到的该行内容,不会报错也不会输出空行。
内容的提问来源于stack exchange,提问作者ICDeadPpl
相关产品推荐
相关产品推荐

