2つのテキストファイルがあり、あるファイルから別のファイルに複数行をコピーしたいと思います。ファイル1にはパッケージのリストがあり、それをリスト2にコピーしたいと思います。このパッケージのリストはファイル1の先頭にはありませんが、リストの先頭に%packagesタグがあり、最後に%endタグがあります。 %packagesと%endの間のすべての行をファイル1からファイル2にコピーする方法を知りたいです。
ベストアンサー1
%packages と %end の間のすべての行を file1 から file2 にコピーするには:
awk '$1=="%end" {f=0;next} f{print;next} $1=="%packages" {f=1}' file1 >>file2
この回避策は、%packages行と%end行を削除することです。 (この行も移動するには、以下に簡単な解決策があります。)
awk
ファイルのすべての行に対して暗黙的に繰り返されるため、上記のコマンドが適用されます。file1
このコマンドは、呼び出されたフラグを使用してのf
パッケージセクション内にあることを確認しますfile1
。パッケージセクションの各行はstdoutとして印刷されますfile2
。
awk
次のコマンドを1つずつ見てみましょう。
$1=="%end" {f=0;next}
このコマンドは、行がで始まることを確認します
%end
。その場合、フラグは0に設定され、対応する行f
にジャンプします。next
f{print;next}
このコマンドはフラグが
f
ゼロでないことを確認します。 0以外の場合は、行を印刷して次の行にジャンプします。$1=="%packages" {f=1}
このコマンドは、行がで始まることを確認します
%packages
。もしそうなら、フラグをf
1に設定してそれ以降の行を印刷します。
マーカーラインが含まれています:
上記には %packages と %end バーは含まれません。これを含めるには、次のようにします。
awk '/^%packages/,/^%end/ {print}' file1 >>file2