用第二个文件中的模式替换文件中的模式

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)

Joh*_*024 6

$ 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 部分,我们只会得到这个语句。