ファイル内のパターンを 2 番目のファイルのパターンに置き換えます

ファイル内のパターンを 2 番目のファイルのパターンに置き換えます

ファイルのデータの一部を別のファイルのデータに置き換えたい。

file1下記のデータがあり、開始パターン:と終了パターン:からデータfile2を保存して置換したいデータがあるとします。file1file2// +++ 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暗黙的にファイルを 1 行ずつループします。この場合、最初に file2 をループし、次に file1 をループします。

  • /SETTINGS START/,/SETTINGS END/ {if (FNR==NR) {a=a"\n"$0}}

    ファイル2 の設定セクションは変数 にキャプチャされますa

  • FNR==NR{next}

    まだ file2 を読み取っている場合は、残りのコマンドをスキップして、次の入力行にジャンプします。

  • /SETTINGS START/{print substr(a,2)}

    ここまで来たら、file1 を処理しています。設定セクションの開始が表示されたら、変数に保存した文字列を出力しますa

  • /SETTINGS START/,/CUSTOMIZATION SETTINGS END/{next}

    file1 の設定セクションにいる場合は、残りのコマンドをスキップして次の入力行に進みます。

  • 1

    1awk の現在の行を印刷するための秘密の省略形です。このステートメントは、設定セクションではなく、file1 にいる場合にのみ表示されます。

関連情報