显示从某些多行模式到末尾的文件内容

显示从某些多行模式到末尾的文件内容

如何显示从多行模式到末尾的文件内容包括图案本身

我刚才问了一个类似的问题,但它是不同的,我想我应该将其作为一个单独的新问题发布。所以请不要仅仅因为这个就标记这个重复项!

例如,如果我有一个像这样的文本文件:

cat
dog
fox
cow
dove
bird
bunny
gnu
hen
dove
bird
buffalo

如果我的模式是这样的:

dove
bird
bunny

我想要得到的是:

dove
bird
bunny
gnu
hen
dove
bird
buffalo

我的真实文件很大,因此如果有多种方法可以实现此目的,我更喜欢更快的方法。

答案1

如果您想从图案第一次出现时开始打印,这很容易。遵循我在中描述的相同逻辑另一个答案,但有一些额外的逻辑:

解析.sed

/^dove$/ {            # Match multi-line pattern
  N                   #  /
  N                   # /
  /\nbird\nbunny$/bb  # When matched jump to label b
}
d                     # Restart with next line if no match
:b                    # \
n                     #  Print the rest of the file
bb                    # /

像这样运行它:

sed -f parse.sed infile

或者作为便携式单线:

sed -n -e '/^dove$/{N;N;/\nbird\nbunny$/bb' -e '};d;:b' -e 'p;n;bb' infile

两种情况下的输出:

dove
bird
bunny
gnu
hen
dove
bird
buffalo

答案2

这是一个 Perl 解决方案:

perl -0777 -ne 'print $1,$2 if m/(dove.bird.bunny)(.*)/sm' myfile

这输出:

dove
bird
bunny
gnu
hen
dove
bird
buffalo

开关-0777打开吸食将整个文件读入内存的模式。使用sm匹配修饰符允许点匹配换行符,同时将字符串视为多行。

-n开关为输入文件创建一个读取循环。当序列鸽子绑定兔子$1看到它,它与剩余的行一起被捕获$2,这就是整体匹配成功时打印的内容。

答案3

awk解决方案:

awk -v RS=" " '{                        # considering space as record separator
                  for(i=1;i<=NF;i++) {  # iterating through all fields
                     if ($i=="dove" && $(i+1)=="bird" && $(i+2)=="bunny") { f=1 } 
                     if (f) print $i 
                  } 
               }' file

输出:

dove
bird
bunny
gnu
hen
dove
bird
buffalo

相关内容