正则表达式不显示多行内容

时间:2014-03-06 10:13:07

标签: regex bash shell awk

我有一个格式如下的文件。

<hello>
<random1>
<random2>
....
....
....
<random100>
<bye>

我想知道再见和你好是否在那里,再见是在你的下面。我试过这个正则表达式。

grep "hello.*bye" filename

但它不符合我的预期。

5 个答案:

答案 0 :(得分:2)

您可以使用pcregrep

pcregrep -M 'hello(\n|.)*bye' filename

-M选项可以搜索跨越线边界的模式。

为了您的输入,它会产生:

<hello>
<random1>
<random2>
....
....
....
<random100>
<bye>

答案 1 :(得分:1)

如果输入文件足够小,您可以尝试:

grep "hello.*bye"  <(tr $'\n' ' ' < filename)

这将替换所有带空格的换行符,从而将文件内容转换为grep一次搜索的单行。

如果您只是简单地删除换行符,请使用:

grep "hello.*bye"  <(tr -d $'\n' < filename)

答案 2 :(得分:1)

$ cat file1.txt
<hello>
<bye>

$ awk '/<hello>/ {hello=1} /<bye>/&&hello {bye=1; exit} END {exit !(hello && bye)}' \
    file1.txt \
    && echo found || echo not found
found

$ cat file2.txt
<bye>
<hello>

$ awk '/<hello>/ {hello=1} /<bye>/&&hello {bye=1; exit} END {exit !(hello && bye)}' \
    file2.txt \
    && echo found || echo not found
not found

答案 3 :(得分:1)

的Perl:

perl -0777 -lne 'print (/hello.*bye/s ? "y" : "n")'

perl -0777 -ne 'exit(! /hello.*bye/s)'

-0777选项将整个文件作为单个字符串包含在内。 “s”标志告诉perl允许“。”匹配换行符。

答案 4 :(得分:1)

使用GNU awk进行多字符RS:

awk -v RS='^$' '{print (/hello.*bye/ ? "y" : "n")}'