我通常用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
来自 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