如何仅选择与 sed 中的正则表达式匹配的第一组行?

如何仅选择与 sed 中的正则表达式匹配的第一组行?

我在 sed 中有以下适用于我的正则表达式:

cat <<EOF | sed -E '/^([A-Z][a-z]+){2,}$/Q'
Nothing Relevant
TotallyFake:

- NowWeWant
- TheseLines
- AndAlsoThisLine                                                                                                       

ButNotThisLine
- OrThisLine          
EOF

这仅输出我们想要的行...但也输出标题行,这不太好。于是我环顾四周,找到了/this/,/that/方法,心想,太酷了!我可以找到第一个 PascalishCase 内容,然后在第一个空行处中断。

所以我尝试了这个:

cat <<EOF | sed -En '/^- ([A-Z][a-z]+){2,}$/,/^$/p'

Nothing Relevant
TotallyFake:

- NowWeWant
- TheseLines
- AndAlsoThisLine

ButNotThisLine
- OrThisLine
EOF

然而...它给了我OrThisLine。这是不太理想的。

我怎样才能使用 sed 找到以 a 开头的 PascalText 的第一个块-并且只打印这些行?

[编辑]

由于内容不够清晰,我想要的输出是:

- NowWeWant
- TheseLines
- AndAlsoThisLine

我的理解是,/this/,/that/会找到第一个this并转到that“this”之后的第一个,但^$模式与第一个空行不匹配,它似乎与 EOF 匹配。

答案1

假设这是一个像这样的 YAML 文件(数组元素的缩进是可选的):

---
Somesection:
Someothersection:
TotallyFake:
  - NowWeWant
  - TheseLines
  - AndAlsoThisLine

ButNotThisLine:
  - OrThisLine

...并且您想要获取顶级TotallyFake数组的元素。

您可以使用 Mike Farah 的(Linux 上最常用的)提取TotallyFake顶级数组(作为 YAML),如下所示:yqyq

$ yq '.TotallyFake' file
- NowWeWant
- TheseLines
- AndAlsoThisLine

如果您希望数组的元素作为单独的行,请通过在末尾TotallyFake添加来扩展数组:[]

$ yq '.TotallyFake[]' file
NowWeWant
TheseLines
AndAlsoThisLine

使用 Andrey Kislyuk 的相应命令yq(众所周知的jqJSON 处理器的包装器):

$ yq -y '.TotallyFake' file
- NowWeWant
- TheseLines
- AndAlsoThisLine

此处,该-y选项指示yq将数据提取为 YAML。如果没有它,我们将得到一个 JSON 编码的数组(相当于["NowWeWant","TheseLines","AndAlsoThisLine"])。

要将元素作为单独的行获取:

$ yq -r '.TotallyFake[]' file
NowWeWant
TheseLines
AndAlsoThisLine

-r选项为我们提供了解码的(“原始”)字符串。


使用sed,将输入视为文本而不是结构化文档格式的文档:

$ sed -e '/^TotallyFake:/,/^$/!d' -e '//d' file
- NowWeWant
- TheseLines
- AndAlsoThisLine

这将删除我们感兴趣的部分之外的所有行,然后使用第二个d命令删除实际范围的开始和结束行。空正则表达式是一种特殊的语法,它告诉sed您重用最近匹配的正则表达式。

请注意,这依靠YAML 文档中可选的空白(数组最后一个元素后面的空行TotallyFake)。

相关内容