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
MONARun Code Online (Sandbox Code Playgroud)
在file2:
MANISH
MADHVI
// +++ CUSTOMIZATION SETTINGS START +++
WELCOME ALL
// +++ CUSTOMIZATION SETTINGS END +++
NISHA
TUSHARRun Code Online (Sandbox Code Playgroud)
在file3作为输出:
ANJALI
NISHA
// +++ CUSTOMIZATION SETTINGS START +++
WELCOME ALL
// +++ CUSTOMIZATION SETTINGS END +++
PREETI
MONARun 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 部分,我们只会得到这个语句。