特定のパターンに従い、文字で始まるすべての行を見つけます。

特定のパターンに従い、文字で始まるすべての行を見つけます。

したがって、次のように、_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
---

categoriesだから、行を探してn()の後に行を表示するためにgrepする方法を知っています...しかし、明らかに各投稿の番号が異なるので、で始まる次の行をすべて-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を使用してこれを行う1つの方法は次のとおりです。ヘッダー行が見つかったら、印刷し、次の行がで始まる限り、次の行をインポートして印刷します-

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

関連情報