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 ^$削除されるため、特殊文字はありません。
  • 別の部分を抽出しようとすると、2つの「セクション」からこれらの部分が得られます。

    $ 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

2番目のレコードを印刷することはNR==1toの明白な変形です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/また、「開始」と「終了」の境界線を印刷します。

入力結果は次のとおりです(次の例では、印刷行の後にコメントが続きます)。

  • そして'/^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/境界線を含むこれらの正規表現に一致する行を取得します。 startは印刷をオンにし、endはオフにします。空白行次の行は印刷を再開しますPackage:

私は使用して変更することができ、sed最初から始まることに気づきました。始まりは1つだけなので、一度だけ一致します。/begin/0

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

関連情報