ファイルデータの一部を他のファイルのデータに置き換えたいです。
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}}
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にある場合にのみ表示されます。