shell - 在 linux 中使用 sed 命令就地删除模式前后的一行

标签 shell sed

forward-zone:
name: "."
forward-addr: 10.1.1.2

forward-zone:
name: "mydomain.com"
forward-addr: 10.1.1.1

我想删除模式“名称:”之前的一行:“。”和模式之后的一行(包括模式本身)。我尝试了以下命令,但这并没有修改文件本身。我想做就地修改。请帮忙

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 命令 hgx 使用 Sed 的 hold space 来保持前一行直到当前行被检查过。地址 1$ 分别处理文件的第一行和最后一行,这可能需要特殊处理。

虽然这是一个教育练习,但不可否认,对于这种多行处理,Awk 甚至 Perl 可能是比 Sed 更好的工具。然而,如您所见,通过一些额外的努力,Sed 可以完成这项工作。

关于shell - 在 linux 中使用 sed 命令就地删除模式前后的一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54393025/

相关文章:

ruby-on-rails - 逐行捕获 shell 命令的输出到一个数组中

regex - 使用 sed/regex/bash 脚本修改版本字符串

shell - 提取最后一行第n列的值

bash - sed 从文件中删除第一行

regex - 我如何在 vim 中翻译正则表达式以与 sed 一起工作?

linux - 引号取消 bash 中的命令传递给变量

Java Runtime.getRuntime.exec() 返回 null 但在 shell 中返回有效字符串

linux - 在 awk 命令 shell 中使用日期

linux - shell 中两个文件的列差异

shell - 使用 sed 在匹配后插入行