Использование gawk для замены шаблона текста содержимым файла, имя которого находится внутри текста

Я пытаюсь заменить текст внутри текстового файла в соответствии с определенными критериями.

Например, если у меня есть три текстовых файла с внешним.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

По окончании замены файл external.txt будет выглядеть так:

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

Общая схема будет заключаться в том, что для каждого экземпляра слова «INCLUDE» замените всю эту строку содержимым файла, имя файла которого следует непосредственно за этим экземпляром «INCLUDE», который в одном случае будет inner1.txt, а во втором случай будет inner2.txt.

Проще говоря, может ли gawk определить, какой текстовый файл следует встроить во внешний текстовый файл, исходя из самого содержимого, которое должно быть заменено во внешнем текстовом файле?


person gawk_Nube    schedule 09.05.2018    source источник
comment
Все ваши строки начинаются с нескольких пробелов?   -  person Cyrus    schedule 09.05.2018
comment
Все они начинаются с разного количества пробелов и/или вкладок. Хотя для меня не имеет значения, если они заменены.   -  person gawk_Nube    schedule 10.05.2018


Ответы (3)


С GNU awk:

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

Если вы установите бит +x в файле редактирования ('chmod +x edit-file'), вы можете сделать:

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

Пояснение:

g/include/s//cat/\

Запускает глобальную команду.

.w\

(из глобального контекста) перезаписывает файл редактирования только текущей строкой (фактически: «cat включенный_файл», где вы заменяете включенный_файл для рассматриваемого имени файла.)

d\

(из глобального контекста) удаляет текущую строку из буфера. (т. е. удаляет «включить включенный_файл», опять же, включенный_файл обозначает рассматриваемый файл).

r !%

(из глобального контекста) считывает вывод выполнения файла по умолчанию (это файл, который мы редактируем, и он был перезаписан выше с помощью «cat...»).

w

(наконец, вне глобального контекста). Записывает (сохраняет) буфер обратно в файл редактирования.

q

покидать.

person gnued    schedule 02.02.2020

С гну сед

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