如何在第二次出现字符串后返回所有内容

时间:2017-01-29 16:58:59

标签: bash awk sed text-processing

我想知道在第二次出现字符串后获取所有内容的最佳方法是什么。我有这样的文件:

---
title: Test Document
creation_date: 01-29-2016
---

Text, blah blah blah
More text, blah blah blah

所以我的文件包含' frontmatter'两个---之间。我希望在第二个---之后返回所有内容,最好使用某种bash命令。想到这一点,想到了sed和awk,但我真的不知道哪一个更适合这份工作。

这一点的一个重要部分是前端可以有任意数量的键值对,所以只需切割前四行就不是一种有效的方法。

3 个答案:

答案 0 :(得分:3)

使用awk你可以这样做:

awk 'p>1; /---/{++p}' file

Text, blah blah blah
More text, blah blah blah

答案 1 :(得分:2)

使用sed,您可以删除两种模式之间的一系列行:

sed '/---/,/---/d' file

自动显示其他行。

More about sed features.

如果你想删除上面的行,你可以使用这个:

sed '1{:a;N;/---.*---/d;ba}' file

细节:

1  # if the current line is the first one
{
    :a  # define a label "a"
    N   # append the next line to the pattern space
    /---.*---/d  # delete the pattern space when the pattern succeeds
    ba  # go to label "a"
}

请注意,d命令无条件地停止脚本,sed继续其余的行。

答案 2 :(得分:1)

这是一个纯粹的Bash解决方案:

while IFS= read -r line || [[ -n $line ]]; do 
    if [[ "$line" =~ ^--- ]]; then
        (( ++count ))
    elif [ $count -ge 2 ]; then
        echo "$line"
    fi
done <file

您可以像sed一样使用awk来打印该模式匹配范围之外的所有内容,如下所示:

awk '/^---/,/^---/ {next} 1' file