我想在 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)
然后,您可以使用简单的搜索并替换为该字符串作为搜索参数,并将其替换为新的包含加上原始注释行。