shell - 在linux中使用sed命令在模式之前和之后就地删除一行
问题描述
forward-zone:
name: "."
forward-addr: 10.1.1.2
forward-zone:
name: "mydomain.com"
forward-addr: 10.1.1.1
我想删除模式 'name: "."' 之前的一行和模式之后的一行(包括模式本身)。我尝试了以下命令,但这并没有修改文件本身。我想做就地修改。请帮忙
sed -n '/name: "."/{N;s/.*//;x;d;};x;p;${x;p;}' file
解决方案
像这样的东西可能适合。
sed -rne '/^name: "\."/{n;n;h;d};1{h;d};x;p;${g;p}' -i file
该-i
选项允许 Sed 修改文件。Sed 命令h
,g
并x
使用 Sed 的保持空间来保持前一行,直到检查当前行。地址1
和$
分别处理文件的第一行和最后一行,这可能需要特殊处理。
虽然这是一个教育练习,但不可否认,对于这种多行处理,Awk 甚至 Perl 可能是比 Sed 更好的工具。尽管如此,如您所见,通过一些额外的努力,Sed 可以完成这项工作。
推荐阅读
- reactjs - react, next.js, gatsby.js - 在深入研究 next.js 或 gatsby.js 之前是否需要先学习 react?
- php - 添加数据时如何使选定的预订 ID 不再出现?
- python - 如何使用 statsmodel 将截距设置为 0 - 用于多元线性回归
- c# - 如何解决我的水印位置问题?
- selenium - 网络浏览器实例测试数
- java - 使用 Spring JDBC 模板在单个事务中执行多个查询(插入和更新)
- elasticsearch - elasticsearch copy_to 格式化日期
- angular6 - Ionic 4 路由器动画未显示
- swift - 如何更改 SpriteNode 中图像的色调颜色
- python-3.x - 如何按列分组并进行标准化?