regex命令行linux - 选择两个字符串之间的所有行

时间:2014-10-21 22:57:32

标签: regex linux grep

我有一个包含以下内容的文本文件:

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,但可以轻松使用它。

4 个答案:

答案 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)

TL; DR

使用语料库,另一种解决问题的方法是将行与前导空格匹配,而不是使用某种类型的触发器操作符来匹配起始行和结束行。以下解决方案适用于您发布的示例。

使用PCRE编译的GNU Grep

$ grep -Po '^\s+\K.*' /tmp/corpus 
this is text that should
be selected with a cool match

替代方案:使用pcregrep而不是

$ pcregrep -o '^\s+\K.*' /tmp/corpus 
this is text that should
be selected with a cool match