空の行で区切られた最初の「段落」または「セクション」の内容のみを返すように入力をパイプしようとしています。他の答えのいくつかに基づいて範囲を使用または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==1
toの明白な変形です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を代わりに使用して開始/終了行などを印刷するタイミング/方法をより適切に制御できます。