【发布时间】:2020-08-03 13:41:15
【问题描述】:
假设我有一个文件,其中包含任意数量的其他文件名(在可识别的分隔符中),例如
original-file-contents-which-should-remain
{{filename.txt}}
more-untouchable-contents
{{dir/myfile.md}}
如何使用 shell 脚本将文件名(和分隔符),即 {{filename.txt}} 和 {{dir/myfile.md}} 替换为相应文件的内容?
我尝试过使用 sed,虽然如果我对目标文件名进行硬编码,它可以工作,但它无法从正则表达式中捕获文件名——即,以下内容删除了 {{myfile}},但没有输入 @987654325 的内容@(我猜可能正则表达式捕获仅适用于 s/old/new 命令):
sed -e "/{{\(.*\)}}/ { r \1" -e "d}" somefile
【问题讨论】:
-
不,
sed无法做到这一点。您必须自己编写这样的工具。我相信它在 GNUawk中是可行的。 -
您包含的文件是否也可以包含此类语句,以便文件名对其内容的扩展需要递归完成?这些占位符字符串是否可以出现在中线,因此包含的文件内容也必须在中线开始/停止?
-
@KamilCuk
sed不是必需的,只是我已经尝试过的。 @EdMorton 递归不是必需的;占位符字符串可以缩进,但替换应保留其原始空格(即,不保留占位符的缩进) -
@dave 我已经更新了占位符缩进的答案(即使我猜你已经自己调整过了)。