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'文件