如何用另一个文件中的一段文本替换文件中两个标记之间的文本?

the*_*ode 10 bash text-processing regular-expression

假设我有一个文本块~/.bashrc

#~/.bashrc
# ...some commands...

# aliases
alias suicide='sudo rm -rf /'
# end aliases

# other commands
Run Code Online (Sandbox Code Playgroud)

我希望用另一个文件中两个标记之间包含的其他一些文本替换该文本块: stuff-to-place-in-bashrc.txt

# stuff-to-place-in-bashrc.txt
# ...stuff...

# aliases
alias ldir='ls * -d'
alias ithinklifeisworthliving='echo all good'
# end aliases

# ...more stuff...
Run Code Online (Sandbox Code Playgroud)

我试过了

 sed -ne 's/# aliases\s+\(.*\)\s+# end aliases/\1/' stuff-to-place-in-bashrc.txt
Run Code Online (Sandbox Code Playgroud)

但我真的在这里的黑暗中摇摆不定。有人可以帮我吗?

  1. 如何从 中提取文本stuff-to-place-in-bashrc.txt

  2. 如何~/.bashrc用问题 1 中提取的文本替换其他部分?

编辑

感谢更新家伙,那些想知道为什么我会想要这样的东西:

允许对脚本文件进行精心挑选的更新,而无需覆盖用户添加的内容。对共享和经常更新的标准操作环境很有用(比如我在Tyro 的最后一份工作是用 XP 编码的)。

去疯狂的家伙。

ikr*_*bbe 11

Ed 是标准编辑器,因为您可以使用它来开发 ed 脚本并让它像您之前测试的那样以交互方式完成其工作。对于像.bashrc或任何代码文本这样的小文件, ed 是高性能的,因为它可以一次性读取整个文件并使用缓冲区。出于同样的原因,您不应将 ed 用于日志文件等大文件。

但是使用 ed 脚本,您的工作很快就完成了:

ed ~/.bashrc<<EOF
/^# aliases
+,/^# end aliases/-1d
-r !sed -n '/^# aliases/,/^# end aliases/p' stuff-to-place-in-bashrc.txt|grep -v '^#'
w
q
EOF
Run Code Online (Sandbox Code Playgroud)

我使用类似的脚本来自动调整配置文件,例如 .asoundrc 以适用于我将笔记本电脑带到的不同环境。

关于 ed 的最佳文档来自非常酷的PLAN9系统的简单手册页。我把它翻译成ed.ps postscript 文件。如果您对PLAN9感兴趣,您应该查看9fronthttp://cat-v.org/,因为原始 bell labs 版本仍在维护中,但具有非常简单的文件系统。

关于编辑器战争、emacs、vim 等的最后一句话:极致规则!