![查找遵循某种模式并以字符开头的所有行](https://linux22.com/image/112277/%E6%9F%A5%E6%89%BE%E9%81%B5%E5%BE%AA%E6%9F%90%E7%A7%8D%E6%A8%A1%E5%BC%8F%E5%B9%B6%E4%BB%A5%E5%AD%97%E7%AC%A6%E5%BC%80%E5%A4%B4%E7%9A%84%E6%89%80%E6%9C%89%E8%A1%8C.png)
所以我有很多 Jekyll 帖子,_posts
标题中包含元数据 YAML,包括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
) 之后显示行...但是有没有办法让它显示以下所有以-
as 开头的行,显然,每个帖子都有不同的编号。也许所有线路直到layout
?
答案1
推荐的文本处理工具是awk
.
尝试这个:
awk '/categories/,/layout/ { if (!/layout/) print }' your_file
此命令打印从categories
直到的所有内容layout
,而无需此行本身。
输出:
categories:
- tips
- programming
- howto
- another-tag
如果您只想拥有 和 之间的项目categories
,layout
您可以简单地向条件添加第二个模式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 (/^-/) }'