開始キーワードと終了キーワードの間に行をコピーして貼り付ける方法は?

開始キーワードと終了キーワードの間に行をコピーして貼り付ける方法は?

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。もしそうなら、フラグをf1に設定してそれ以降の行を印刷します。

マーカーラインが含まれています:

上記には %packages と %end バーは含まれません。これを含めるには、次のようにします。

awk '/^%packages/,/^%end/ {print}' file1 >>file2

おすすめ記事