我想用另一个文件中的数据替换文件的部分数据。
假设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 中而不是在设置部分中时,我们才会看到此语句。