パターンに従い、文字で始まるすべての行を検索します

パターンに従い、文字で始まるすべての行を検索します

そのため、次のような_posts、ヘッダーにメタデータ YAML を含むJekyll 投稿が多数あります。categories

---
excerpt: "I am an excerpt"
categories:
- tips
- programming
- howto
- another-tag
layout: blog
title: I am a Page Title
created: 1267026549
permalink: blog/27-05-2017/clean-url-goes-here
---

行を grep して( ) の後の行categoriesを表示する方法はわかっていますが、各投稿には異なる番号が付いているので、 で始まる後続の行をすべて表示する方法はありますか。までのすべての行を表示できますか?n-An-layout

答え1

テキスト処理に推奨されるツールは ですawk

これを試して:

awk '/categories/,/layout/ { if (!/layout/) print }' your_file

このコマンドは、この行自体を除いて、からcategoriesまでのすべてを印刷します。layout

出力:

categories:
- tips
- programming
- howto
- another-tag

categoriesとの間にある項目のみを取得したい場合は、次のように条件layoutに 2 番目のパターンを追加するだけです。if

awk '/categories/,/layout/ { if (!/layout/ && !/categories/) print }' your_file

出力は次のようになります。

- tips
- programming
- howto
- another-tag

答え2

pcregrep(Perl互換の正規表現)を使用できる場合:

pcregrep -M 'categories.*(\n-.*)*' file

または先読みアサーションを使用する:

pcregrep -M 'categories(.|\n)*(?=layout)' file

答え3

sed -e '/^categories:/,/^[^-]/!d;//d' yourfile

答え4

awk でこれを行う方法は次のとおりです。ヘッダー行を見つけたら、それを印刷し、次の行が . で始まる限り、次の行を取得して印刷し続けます-

awk '$0=="categories:" { do { print; getline } while (/^-/) }'

関連情報