sed 脚本在文件中最后一个匹配行之后插入行

sed 脚本在文件中最后一个匹配行之后插入行

我想在 sed 中编写一个脚本,在文件中所有类似的行之后插入行到文件中。所以我需要找到模式的最后一个匹配项并立即插入到它后面。这不太可能是文件中的最后一行。

我见过许多解决方案,它们采用对 sed 的多个管道调用或使用其他工具(例如 tac)。这些都是不合适的 - 我需要一个纯 sed 解决方案,可以嵌入到一个更大的脚本中,对同一文件进行其他更改。

我已经搜索了一段时间,但怀疑这是不可能的。我想在放弃之前我应该​​在这里问一下!

如果具体情况有助于解释,我想找到 Apache http.conf 文件中的最后一个“Include”指令,并在最后一个指令下方插入另一个指令。

答案1

从技术上讲,下面的脚本(经过最低限度的测试)似乎可以满足您的要求。原理是把线存放在hold space;当include遇到一行时,打印所有累积的行并清除保留空间;在输入末尾,添加new到累积行并打印。

#n
H
$ {
  g
  s/^/new/
  p
  b
}
/include/ {
  g
  s/^\n//
  p
  s/.*//
  h
  b
}

这不太可能很好地集成到现有的 sed 脚本中。你确实扩展了 sed 的能力。

Apache 配置文件可以轻松装入内存。不要使用流式编辑器,而是使用 Perl 或 Python 等不错的工具加载它,或者至少使用 awk。

答案2

可能有一个真正的解决方案,sed其他人会参与其中,但很久以前我用这个黑客解决了同样的场景。

我在配置文件中我想要用脚本插入新内容的位置放置了一个小注释“标记”。说:

#(Insert includes here)

然后,您可以使用简单的搜索并替换为该字符串作为搜索参数,并将其替换为新的包含加上原始注释行。

相关内容