使用 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
退出。
我正在尝试根据特定条件替换文本文件中的文本。
例如,如果我有三个文本文件,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
退出。