如何grep获取具有特定格式的多行,但如果其中一行有特定的单词,则不包含这些行



我有一个很大的文件目录,我需要在其中查找特定的行,因为它们需要更新。

我正在寻找的格式总是以<topicref开头,然后在那之后,它必须有href>或/祝辞。

到目前为止,我已经提出了一个正则表达式,用于查找我想要的行:
pcregrep -HnM '<topicref(.*) href="../(.*).dita(.*)[^>]*'

但是,我在过滤具有scope="peer"的结果时遇到了麻烦。我试着做

pcregrep -HnM '<topicref(.*) href="../(.*).dita(.*)[^>]*' directory | pcregrep - Mv 'scope="peer" > file

但是,这样做的结果将严格显示所有没有'scope="peer"'的行,从以前的pcregrep的总体结果中,所以会有不应该包括的随机结果,而且我也无法跟踪这些结果来自哪些文件。

有没有可能看到所有提到的<topicref href="../... >而没有scope="peer"?

三个scope="peer":

的行示例
<topicref href="../cat.md" scope="peer"
something />
<topicref href="../cat.md"
something scope="peer"
something />
<topicref href="../cat.md"
scope="peer"
something></topicref><map>

可以使用

pcregrep -HnM '<topicref(?![^>]*sscope="peer")(?:s[^>]+)?shref="../([^"]*).dita[^>]*>' file

细节

  • <topicref-一个文字字符串
  • (?![^>]*sscope="peer")-除>外,当前位置右边的任何零个或多个字符后不允许有空格+scope="peer"
  • (?:s[^>]+)?-一个可选的空白,一个或多个字符,而不是>
  • shref="../-空格,href="../字符串
  • ([^"]*)-组1:除"以外的零个或多个字符
  • .dita-.dita字符串(如果需要匹配.md,则替换为.md)
  • [^>]*>- 0个或多个除>以外的字符,然后是>

最新更新