我有一个如下所示的文件:
---
some metadata
...
---
Some real content.
...
Important content.
预期输出:
Some real content.
...
Important content.
为了简单起见,让我们考虑严格的/^---$/
行除了作为标题元数据块的开始和结束分隔符之外不会发生在其他任何地方。如上图所示。
---
注意:结束分隔符和第一行内容之间可以有任意数量的新行。在这种情况下,我不在乎是否保留新行。
我想最好使用awk
这个命令,因为我觉得这个命令用途广泛且功能强大,足以帮助我在以后需要时对文件进行更多操作。
基于这是对另一个类似问题的回答,我尝试了以下方法但未成功:
awk '/---/ {s=1} /---/ && s==1 {s=0} !s' $file
可能是因为第二条规则实际上再次匹配文件的第一行?
还有另一种方法可以有效地做到这一点吗awk
?
答案1
怎么样:
awk 'BEGIN { metadata = 0 } /---/ { metadata = !metadata; next } !metadata' FILE
使用以下输入FILE
(我添加了更多行):
---
some metadata
...
---
Some real content.
...
Important content.
---
some metadata
...
---
1
2
3
它打印:
Some real content.
...
Important content.
1
2
3
你的脚本:
awk '/---/ {s=1} /---/ && s==1 {s=0} !s' $file
不起作用,因为您首先设置s
为 1:
/---/ {s=1}
你立即地将其设置为 0:
/---/ && s==1 {s=0}
并打印记录 if !s
, IOW!0
因此在一天结束时打印每一行。
答案2
GNU sed使用扩展正则表达式 读作从 dash-dash 删除到 dash-dash。
sed -Ee '
/^-+$/,/^-+$/d
' file
答案3
awk '/^---$/ && s++<2{ next } s>1 && NF' infile
答案4
sed '/metadata/,+2d' filename| sed '/---/d'
输入
---
some metadata
...
---
Some real content.
...
Important content.
---
some metadata
...
---
1
2
3
输出
Some real content.
...
Important content.
1
2
3