我在 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),如下所示:yq
yq
$ yq '.TotallyFake' file
- NowWeWant
- TheseLines
- AndAlsoThisLine
如果您希望数组的元素作为单独的行,请通过在末尾TotallyFake
添加来扩展数组:[]
$ yq '.TotallyFake[]' file
NowWeWant
TheseLines
AndAlsoThisLine
使用 Andrey Kislyuk 的相应命令yq
(众所周知的jq
JSON 处理器的包装器):
$ 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
)。