Заменить шаблон в файле шаблоном во втором файле

Заменить шаблон в файле шаблоном во втором файле

Я хочу заменить часть данных файла данными из другого файла.

Предположим, file1что у меня есть данные, как указано ниже, и file2есть некоторые данные, которые я хочу сохранить и заменить, file1начиная file2с начального шаблона: // +++ CUSTOMIZATION SETTINGS START +++и заканчивая конечным шаблоном // +++ CUSTOMIZATION SETTINGS END +++:.

В file1:

ANJALI
NISHA

// +++ CUSTOMIZATION SETTINGS START +++ 

WE WILL BE ON LEAVE FOR TODAY 

// +++ CUSTOMIZATION SETTINGS END +++ 

PREETI
MONA

В file2:

MANISH
MADHVI

// +++ CUSTOMIZATION SETTINGS START +++ 

WELCOME  ALL 

// +++ CUSTOMIZATION SETTINGS END +++ 

NISHA
TUSHAR

В file3качестве вывода:

ANJALI
NISHA

// +++ CUSTOMIZATION SETTINGS START +++ 

WELCOME  ALL 

// +++ CUSTOMIZATION SETTINGS END +++ 

PREETI
MONA

решение1

$ awk '/SETTINGS START/,/SETTINGS END/ {if (FNR==NR) {a=a"\n"$0}} FNR==NR{next}   /SETTINGS START/{print substr(a,2)} /SETTINGS START/,/CUSTOMIZATION SETTINGS END/{next}  1' file2 file1
ANJALI NISHA

// +++ CUSTOMIZATION SETTINGS START +++

WELCOME ALL

// +++ CUSTOMIZATION SETTINGS END +++

PREETI MONA

Объяснение

awkнеявно проходит по файлам строка за строкой. В этом случае мы сначала проходим по file2, затем по file1.

  • /SETTINGS START/,/SETTINGS END/ {if (FNR==NR) {a=a"\n"$0}}

    Раздел настроек из файла file2 сохраняется в переменной a.

  • FNR==NR{next}

    Если мы все еще читаем file2, пропустите оставшиеся команды и перейдите к следующей строке ввода.

  • /SETTINGS START/{print substr(a,2)}

    Если мы попали сюда, мы обрабатываем file1. Когда мы увидим начало раздела настроек, выведем строку, которую мы сохранили в переменной a.

  • /SETTINGS START/,/CUSTOMIZATION SETTINGS END/{next}

    Если мы находимся в разделе настроек файла file1, пропустите остальные команды и перейдите к следующей строке ввода.

  • 1

    1это криптографическое сокращение awk для печати текущей строки. Мы получаем этот оператор только если находимся в file1, но не в разделе настроек.

Связанный контент