我有一个格式如下的文件。
<hello>
<random1>
<random2>
....
....
....
<random100>
<bye>
我想知道再见和你好是否在那里,再见是在你的下面。我试过这个正则表达式。
grep "hello.*bye" filename
但它不符合我的预期。
答案 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")}'