
ファイルのデータの一部を別のファイルのデータに置き換えたい。
に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
暗黙的にファイルを 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
1
awk の現在の行を印刷するための秘密の省略形です。このステートメントは、設定セクションではなく、file1 にいる場合にのみ表示されます。