使用 gawk 将文本模式替换为文件名在文本内的文件的内容

Using gawk to Replace a Pattern of Text with the Contents of a File Whose Filename is Inside the Text

我正在尝试根据特定条件替换文本文件中的文本。

例如,如果我有三个文本文件,outer.txt 包含:

   Blah Blah Blah
   INCLUDE inner1.txt
   Etcetera Etcetera
   INCLUDE inner2.txt
   end of file

和inner1.txt包含:

  contents of inner1

和inner2.txt包含:

  contents of inner2

替换结束时,outer.txt 文件看起来像:

    Blah Blah Blah
    contents of inner1
    Etcetera Etcetera
    contents of inner2
    end of file

总体模式是,对于单词 "INCLUDE" 的每个实例,将整行替换为文件名紧跟在 "INCLUDE" 实例之后的文件的内容,在一种情况下将是 inner1.txt,在第二种情况下将是 inner2.txt.

更简单地说,gawk 是否可以根据外部文本文件中要替换的内容来确定将哪个文本文件嵌入到外部文本文件中?

使用 GNU awk:

awk --load readfile '{if (=="INCLUDE") {printf readfile()} else print}' outer.txt

使用 gnu sed

sed -E 's/( *)INCLUDE(.*)/printf "%s" "";cat /e' outer.txt

如果在编辑文件中设置 +x 位 ('chmod +x edit-file'),那么您可以:

g/include/s//cat/\
.w\
d\
r !%
w
q

解释:

g/include/s//cat/\

启动全局命令。

.w\

(从全局上下文中),仅用当前行覆盖编辑文件(有效:'cat included_file',您将 included_file 替换为相关文件名。)

d\

(从全局上下文中),从缓冲区中删除当前行。 (即再次删除 'include included_file',代表相关文件的 included_file)。

r !%

(从全局上下文中),读取执行默认文件的输出(这是我们正在编辑的文件,上面被 'cat...' 覆盖)。

w

(最后,在全局范围之外)。将缓冲区写回(保存)到编辑文件。

q

退出。