Python 筛选出现在两个标记之间的文本 第一部分

Python 筛选出现在两个标记之间的文本 第一部分,python,shell,text,awk,filtering,Python,Shell,Text,Awk,Filtering,创建只输出由两个预定义标记包围的文本的文本过滤器的最简单方法是什么。我不介意使用任何标准工具:sed、awk、python 例如,我只希望显示由“标记开始”和“标记结束”包围的文本 input: Text 1 Mark Begin Text 2 Mark End Text 3 Mark Begin Text 4 MarK End Text 4 output: Text 2 Text 4 第二部分 如何修改解决方案,以便只将最后一次出现的内容写入输出,因此对于上述相同的输入,我们得到: out

创建只输出由两个预定义标记包围的文本的文本过滤器的最简单方法是什么。我不介意使用任何标准工具:sed、awk、python

例如,我只希望显示由“标记开始”和“标记结束”包围的文本

input:
Text 1
Mark Begin
Text 2
Mark End
Text 3
Mark Begin
Text 4
MarK End
Text 4

output:
Text 2
Text 4
第二部分 如何修改解决方案,以便只将最后一次出现的内容写入输出,因此对于上述相同的输入,我们得到:

output:
Text 4
使用Python和惰性生成器的功能(无状态)实现:

import itertools

def get_lines_between_marks(ilines, start_mark, end_mark):
    for line in ilines:
        if line.strip().lower() == start_mark:
            yield list(itertools.takewhile(lambda s: s.strip().lower() != end_mark, ilines))

for group in get_lines_between_marks(open("file.txt"), "mark begin", "mark end"):
    for line in group:
        print line,
# Text 2
# Text 4
现在,您的第二个请求很简单(请参阅iterlast):

第一部分

第二部分

awk '
    tolower($0) ~ /mark begin/ {capturing = 1; text = ""; next}
    tolower($0) ~ /mark end/   {capturing = 0; sep = ""; next}
    capturing                  {text = text sep $0; sep = "\n"}
    END                        {print text}
'
要输出每个:

sed -n '/^Mark Begin$/{:a;n;/^Mark End$/b;p;ba}' inputfile
输出最后一个

sed -n '${x;s/\n//;p};/^Mark Begin$/{x;s/.*//;x;:a;n;/^Mark End$/b;H;ba}'

我找到了一个很好的解决方案:

awk '/Mark End/, /Mark Begin/' file.lst

对于第二种情况,但它毕竟需要标记过滤。

感谢所有接受此测试的人。我选择了这个,因为它对我来说是最简单的:最容易从命令行使用。
sed -n '/^Mark Begin$/{:a;n;/^Mark End$/b;p;ba}' inputfile
sed -n '${x;s/\n//;p};/^Mark Begin$/{x;s/.*//;x;:a;n;/^Mark End$/b;H;ba}'
awk '/Mark End/, /Mark Begin/' file.lst