Grep正则表达式 - 在标签之间选择文本但是文本包含字符串AND在第一个结束标记处停止

时间:2015-08-11 16:27:08

标签: regex grep

我使用的命令:

grep -oP '(?s)opentag.*?myString.*?closetag' myFile

当在标签之间找到文本'myString'时,这工作正常。  对于这种情况:

opentag
  myString
closetag

结果是:

myString

但是当找不到'myString'时,grep会考虑下一个'closetag'。例如:

opentag
closetag
  myString
closetag

结果是:

closetag
  myString

有没有办法在第一次“closetab”读取时停止解析? 在这种情况下,不会有任何结果。

我可以通过编码解析器而不是时间和动机来实现。

感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

您可以在此处使用negative lookahead

(?s)opentag((?!(?:open|close)tag).)*myString((?!(?:open|close)tag).)*closetag

参见演示。

https://regex101.com/r/eX9gK2/6

答案 1 :(得分:1)

好悲伤,只需使用带有标志的awk来指示你何时进入开/关区块:

awk '/opentag/{f=1} f&&/myString/; /closetag/{f=0}' file

举例:

$ cat file1
opentag
  myString
closetag
$
$ awk '/opentag/{f=1} f&&/myString/; /closetag/{f=0}' file1
  myString
$

$ cat file2
opentag
closetag
  myString
closetag
$
$ awk '/opentag/{f=1} f&&/myString/; /closetag/{f=0}' file2
$

当说明一个简单的问题时,它应该是一个简单的问题需要解决!