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

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

假设我有一段文本~/.bashrc

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

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

# other commands

我希望将该文本块替换为另一个文件中两个标记之间包含的其他文本: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...

我试过了

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

但我真的是在黑暗中摇摆。有人可以帮我吗?

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

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

编辑

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

允许对脚本文件进行精心挑选的更新,而不会覆盖用户添加的内容。对于共享和经常更新的标准操作环境很有用(就像我在初学者用 XP 编码)。

发疯吧伙计们。

答案1

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

我使用类似的脚本来自动调整配置文件,例如针对我的笔记本电脑所处的不同环境的 .asoundrc 。

关于 ed 的最佳文档来自非常酷的简单手册页计划9系统。我把它翻译成ed.ps后记文件。如果您有兴趣计划9你应该检查一下9前线http://cat-v.org/因为最初的贝尔实验室版本仍然保留,但有一个非常简单的文件系统。

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

答案2

set /^\#aliases/  /^\#end\ aliases/
sed -ne"$1,$2"'s/\\\{0,1\}/&&/gp' <stuff_to_place...rc |
sed -e"$1,$2c\" -f- ./infile >./outfile

如果您想就地编辑文件ed非常好的解决方案。如果您想在流中编辑它,请使用sed.避免sed -i

答案3

当然,您可以ed单独完成此操作,无需额外的工具:

ed -s stuff_to_place.txt<<\IN
1,/# aliases/d
/# end aliases/,$d
,d
.r /home/username/.bashrc
/# aliases/x
.t.
.,/# end aliases/-d
,p
q
IN

如果您对结果感到满意,请替换,pw /home/username/.bashrc以将更改写入(请注意与和 一起~/.bashrc使用的完整路径;如果它位于 中,则可以简单地使用)。 这是如何工作的:我们首先从 中删除不需要的行。然后我们用 删除剩余的(别名)。文本缓冲区现在为空,而剪切缓冲区包含我们想要的行。然后,我们将内容写入文本缓冲区,将剪切缓冲区的内容()放在该行之后,复制粘贴的最后一行(),然后从复制的行中删除直到但不包括,最后rint 或rite变化和uit。rw.bashrccwd
dstuff_to_place.txt,dr.bashrcx/# aliases/.t./# end aliases/pwq

相关内容