固定テキストから最初の空白行までawkを実行する

固定テキストから最初の空白行までawkを実行する

空白行で区切られた最初の「段落」または「セクション」のみを返すパイプを試みています。他の回答に従って、awkまたはを使用しsedて範囲を取得できると思いましたが、うまくいかないようです。

$ cat txt
Package: plasma-desktop
Architecture: amd64
Version: 4:5.12.9.1-0ubuntu0.1
Supported: 3y

Package: plasma-desktop
Architecture: amd64
Version: 4:5.12.4-0ubuntu1
Supported: 3y

$ cat txt |awk '/^Package:/,/^$/'
Package: plasma-desktop
Architecture: amd64
Version: 4:5.12.9.1-0ubuntu0.1
Supported: 3y

Package: plasma-desktop
Architecture: amd64
Version: 4:5.12.4-0ubuntu1
Supported: 3y

最初の「セクション」のみを返すべきではないでしょうか? (次のように: 固定テキストから最初の空白行までGrepする そして https://www.unix.com/shell-programming-and-scripting/148692-awk-script-match-pattern-till-blank-line.html

  • 使用するとgrep -ve ^$空白行が削除されるため、特殊文字はなくなります。
  • 別の部分を抽出しようとすると、両方の「セクション」から部分が取得されます。

    $ cat txt |awk '/^Package:/,/^Version:/'
    Package: plasma-desktop
    Architecture: amd64
    Version: 4:5.12.9.1-0ubuntu0.1
    Package: plasma-desktop
    Architecture: amd64
    Version: 4:5.12.4-0ubuntu1
    
  • sed -n '/^Package:/,/^$/p'または を使用するとsed -n '/^Package:/,/^Version:/p'、同等の awk と同じ結果が得られます。

最初に発生した後、どうすれawkば停止できますか?sed

答え1

これがまさに awk に段落モードがある理由です。

$ awk -v RS= 'NR==1' file
Package: plasma-desktop
Architecture: amd64
Version: 4:5.12.9.1-0ubuntu0.1
Supported: 3y

NR==12 番目のレコードを印刷するには、を に変更するだけですNR==2

$ awk -v RS= 'NR==2' file
Package: plasma-desktop
Architecture: amd64
Version: 4:5.12.4-0ubuntu1
Supported: 3y

ちなみに、範囲式は絶対に使用しないでください。フラグを使用するよりも、些細な問題のコードがほんの少しだけ短くなりますが、要件が少しでも変更されると、完全に書き直すか、条件を複製する必要があります。したがって、/begin/,/end/sed または awk を使用する必要がある場合は/begin/{f=1} f{print} /end/{f=0}、代わりに awk を使用してください。これにより、開始行や終了行などをいつどのように印刷するかについて、はるかに細かく制御できます。

答え2

では/begin/,/end/、一致が見つかるたびに「アクション フラグ」がオンになり/begin/、一致が見つかるとオフになります/end/。また、「begin」と「end」の境界線も印刷されます。

入力の結果は次のとおりです (以下のサンプルでは、​​印刷された行の後にコメントが付きます)。

  • '/^Package:/,/^$/'
    Package: plasma-desktop        #TURN ON
    Architecture: amd64            #
    Version: 4:5.12.9.1-0ubuntu0.1 #
    Supported: 3y                  #
                                   #TURN OFF
    Package: plasma-desktop        #TURN ON
    Architecture: amd64            #
    Version: 4:5.12.4-0ubuntu1     #
    Supported: 3y                  #
  • '/^Package:/,/^Version:/'
    Package: plasma-desktop        #TURN ON
    Architecture: amd64            #
    Version: 4:5.12.9.1-0ubuntu0.1 #TURN OFF
    Supported: 3y

    Package: plasma-desktop        #TURN ON
    Architecture: amd64            #
    Version: 4:5.12.4-0ubuntu1     #TURN OFF
    Supported: 3y

「Package:」で始まる段落だけを印刷するには、次のように記述します。

sed -ne '/^$/q' -e '/^Package:/,$p' file

sedのため、空白行が見つかるとすぐにファイルの処理を終了します/^$/q

awk

awk '/^$/{exit};/^Package:/,0' file

答え3

コメントしたようにカジモド

/begin/,/end/境界線を含む、それらの正規表現に一致する行を取得します。begin は印刷をオンにし、end はオフにします。空白行の直後の行にも が含まれているため、印刷が再びオンになりますPackage:

を にsed変更して使用できることに気付きました。先頭から始まるようになります。先頭は 1 つしかないため、一致するのは 1 回だけです。/begin/0

$ cat txt |sed -n '0,/^$/p'
Package: plasma-desktop
Architecture: amd64
Version: 4:5.12.9.1-0ubuntu0.1
Supported: 3y

関連情報