
Я хочу заменить часть данных файла данными из другого файла.
Предположим, 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, но не в разделе настроек.