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

Bash 如何在字符串第二次出现后返回所有内容,bash,awk,sed,text-processing,Bash,Awk,Sed,Text Processing,我想知道在第二次出现字符串之后获得所有内容的最佳方法是什么。我有这样的文件: --- title: Test Document creation_date: 01-29-2016 --- Text, blah blah blah More text, blah blah blah 所以我有一个文件,它包含两个--之间的“frontmatter”。我希望在第二次--之后返回所有内容,最好使用某种bash命令。想到这一点,我想到了塞德和奥克,但我真的不知道哪一个更适合这份工作 这其中的一个重要部

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

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

Text, blah blah blah
More text, blah blah blah
所以我有一个文件,它包含两个
--
之间的“frontmatter”。我希望在第二次
--
之后返回所有内容,最好使用某种bash命令。想到这一点,我想到了塞德和奥克,但我真的不知道哪一个更适合这份工作


这其中的一个重要部分是,frontmatter中可以有任意数量的键值对,因此仅剪切前四行不是有效的方法。

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

sed '/---/,/---/d' file
其他行将自动显示

如果也要删除上面的行,可以使用以下行:

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继续执行剩余的行。

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

sed '/---/,/---/d' file
其他行将自动显示

如果也要删除上面的行,可以使用以下行:

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继续执行剩余的行。

使用awk可以执行以下操作:

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

Text, blah blah blah
More text, blah blah blah

使用awk可以执行以下操作:

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

Text, blah blah blah
More text, blah blah blah

下面是一个纯Bash解决方案:

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

下面是一个纯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解决任何问题时:sed用于单个行上的简单替换(仅此而已),awk用于其他所有内容。您所描述的问题不是单个行的简单替换,因此它不是sed的工作,而是awk的工作。如果您尝试将sed用于其他任何用途,您将很快发现自己陷入无法理解的符文、可移植性问题、效率低下以及几乎所有其他软件的不良属性的地狱。最好用精确的输入解释您有一个您想要的精确输出。如果您真的计划进行大量的自动查询,一个不同的文件格式是有序的。这看起来像是为人眼的快速扫描而设计的,而不是程序解析。当试图弄清楚是否应该使用sed或awk解决任何问题时:sed用于单个行上的简单替换(仅此而已),awk用于其他所有内容。您所描述的问题不是单个行的简单替换,因此它不是sed的工作,而是awk的工作。如果您尝试将sed用于任何其他用途,您将很快发现自己陷入了无法辨认的符文、可移植性问题、效率低下以及几乎所有其他软件的不良属性的地狱。这将打印出第一个
--
上方的行;不清楚这是否是OP的一个问题。@dawg:我已经添加了另一个版本来做这件事;p’file这将打印第一个
--
上方的行;不清楚这是否是OP的一个问题。@dawg:我已经添加了另一个版本来做这件事;p'文件