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

时间:2018-05-09 19:15:03

标签: text awk sed gawk ed

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

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

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

包含以下内容的inner1.txt:

  contents of inner1

and 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是否有可能根据要在外部文本文件中替换的内容来确定将哪个文本文件嵌入到外部文本文件中?

3 个答案:

答案 0 :(得分:1)

如果您在编辑文件(“ chmod + x编辑文件”)上设置了+ x位,则可以执行以下操作:

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

说明

g/include/s//cat/\

启动全局命令。

.w\

(从全局上下文中),仅用当前行覆盖编辑文件(有效地是:“ cat included_file”,在其中用有问题的文件名替换了include_file)。

d\

(从全局上下文中),从缓冲区中删除当前行。 (即再次删除“ include included_file”,included_file代表该文件)。

r !%

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

w

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

q

退出。

答案 1 :(得分:0)

使用GNU awk:

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

答案 2 :(得分:0)

使用gnu sed

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