如何匹配最后一个 YAML 分隔符之后的所有内容

如何匹配最后一个 YAML 分隔符之后的所有内容

我通常用grep它来搜索字符串中的模式。然而在这个特定实例中,我必须识别 YAML 标头,而且它以三连字符结尾。

我的 test.info 文件包含以下内容

---
title: dont't know
draft: true
---
this is a test to add some extra content

我想要以下输出,即来自最后的YAML 分隔符直到文件结束:

this is a test to add some extra content

当我输入破折号时,bash 返回以下错误:

$ cat test.info | grep '---' -A1
grep: unrecognized option `---'

我尝试“转义”破折号,但没有成功。有什么想法吗?这是针对 BSD grep 的。让我感到困惑的是,如果我执行类似下面的操作,我就能得到我想要的东西。

$ cat test.info | grep 'this' -A1

问题是我不知道第一个词是什么。

我可以按照建议对文件进行 grep,但是该工具会立即返回模式而不是所有内容:

$ grep -m 1 -e '---' test.info 
---
$ grep -- --- test.info | tail -1
---

答案1

这个命令怎么样?

tac file| awk '/---/ {exit} {print}'|tac

在 OSX 上,只需将两个tac命令替换为tail -r

来自 man tac:

tac-反向连接并打印文件-cat 命令的反向操作;)

输出tac file

next line
this is a test to add some extra content
---
draft: true
title: dont't know
---

awk 命令awk '/---/ {exit} {print}'打印所有行,直到找到第一个匹配的模式。

输出:

next line
this is a test to add some extra content

然后再次运行tac命令以恢复默认值。

输出:

this is a test to add some extra content
next line

答案2

$ line=$(grep -n -- --- test.info | tail -n 1 | cut -d: -f1);tail -n +$(( $line + 1 )) test.info
这是添加一些额外内容的测试

需要添加适当的错误检查,例如if $line 'not numeric' ...

最初的问题来自于您需要退出-或告诉程序这不是一个选项:

$ grep -n -- --- 测试信息
1:---
4:---

大多数 (?) gnu 软件都有“--”作为选项;告诉在该点之后停止解析更多选项。

注意:
$ grep --version
应该告诉它是否是 GNU grep 实用程序。

$ grep -h
或者
$ grep --help
通常会说出它理解的选项。

答案3

使用 awk:

awk 'END{print}' RS='---' file

RS定义---为记录分隔符,END{print}我们只打印最后一条记录。

使用 sed:

sed -r ':a;$!{N;ba};s:^(.*\n?)---::' file

答案4

因此,我不想承担任何责任,我只是发布了在我的 Mac 上有效的解决方案,感谢 KasiyA

tail -r file| awk '/---/ {exit} {print}'| tail -r

相关内容