我有一个包含以下内容的文本文件:
here is some super text:
this is text that should
be selected with a cool match
And this is how it all ends
blah blah...
我试图在两者之间获得两条线(但可能是更多或更少的线):
一些超级文字:
和
这就是
我在ubuntu机器上使用grep
,我发现的很多模式似乎都特定于不同类型的正则表达式引擎。
所以我应该最终得到这样的东西:
grep "my regex goes here" myFileNameHere
不确定是否需要egrep
,但可以轻松使用它。
答案 0 :(得分:2)
您可以在sed中使用地址:
sed -e '/some super text/,/And this is how/!d' file
!d
表示如果不在"范围内,则不会输出。
要排除边框线,您必须更聪明:
sed -n -e '/some super text/ {n;b c}; d;:c {/And this is how/ {d};p;n;b c}' file
或类似地,在Perl中:
perl -ne 'print if /some super text/ .. /And this is how/' file
要再次排除边框线,请将其更改为
perl -ne '$in = /some super text/ .. /And this is how/; print if $in > 1 and $in !~ /E/' file
答案 1 :(得分:1)
我不知道如何在grep
中完成。使用awk
:
awk '/^And this is how/ {p=0}; p; /some super text:$/ {p=1}' file
答案 2 :(得分:1)
尝试使用pcregrep而不是普通的grep。因为普通的grep不会帮助你连续获取多行。
$ pcregrep -M -o '(?s)some super text:[^\n]*\n\K.*?(?=\n[^\n]*And this is how)' file
this is text that should
be selected with a cool match
(?s)
Dotall修饰符允许点匹配甚至换行符。\K
丢弃之前匹配的字符。来自pcregrep --help
-M, --multiline run in multiline mode
-o, --only-matching=n show only the part of the line that matched
答案 3 :(得分:0)
使用语料库,另一种解决问题的方法是将行与前导空格匹配,而不是使用某种类型的触发器操作符来匹配起始行和结束行。以下解决方案适用于您发布的示例。
$ grep -Po '^\s+\K.*' /tmp/corpus
this is text that should
be selected with a cool match
$ pcregrep -o '^\s+\K.*' /tmp/corpus
this is text that should
be selected with a cool match