yis*_*sha 2 bash sed awk text-processing
我想用另一个文件中的数据替换文件数据的一部分。
假设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
Run Code Online (Sandbox Code Playgroud)
在file2
:
MANISH
MADHVI
// +++ CUSTOMIZATION SETTINGS START +++
WELCOME ALL
// +++ CUSTOMIZATION SETTINGS END +++
NISHA
TUSHAR
Run Code Online (Sandbox Code Playgroud)
在file3
作为输出:
ANJALI
NISHA
// +++ CUSTOMIZATION SETTINGS START +++
WELCOME ALL
// +++ CUSTOMIZATION SETTINGS END +++
PREETI
MONA
Run Code Online (Sandbox Code Playgroud)
$ 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
Run Code Online (Sandbox Code Playgroud)
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 而不是在 settings 部分,我们只会得到这个语句。