使用 grep 识别不正确的标题

使用 grep 识别不正确的标题

我有数百个文档,其中每个标题的形式如下:

# Some title here {.WORD} 

我想识别使用grep不遵循此标准的每个标题。但是,不应检测仅以 # 开头的行。

##                          | OK
# Lorem .tip}               | NOT OK
# LIPSUM {.tip              | NOT OK
### Lipsum {.hello word}    | OK 
# Title                     | NOT OK
######## Title {.challenge} | OK

我编写了以下正则表达式来解决这种情况

^##* .*(?<!{.*})$

但是解析器抱怨“lookbehind断言不是固定长度”如何,我可以修复上面的正则表达式来解决这个问题吗?

答案1

$ grep -vE '^#+( [ [:alpha:]]+ \{\.[ [:alpha:]]+\})?$' file
# Lorem .tip}
# LIPSUM {.tip
# Title

扩展正则表达式匹配“OK”行。我们-v要求查看不匹配的行。

该模式要求该行以一定数量的#字符开头。该行的其余部分是可选的,但如果存在,则必须以空格开头,然后包含多个字母,中间可能有空格,最后一个空格位于 之前{{and中的部分}必须以点开头,并且可以包含一定数量的字母和空格。

答案2

当使用lookaheads/lookbehinds时,你不能在其中放置任何glob类型的正则表达式,它们只能是固定长度的字符串。

您可以使用 PCRE 工具grep执行此操作:

$ grep -vP "(?<=#)*\s*\w*\s*{.*}|^[#]+$" afile
# Lorem .tip}
# LIPSUM {.tip
# Title

这是如何运作的:

  • (?<=#)*查找至少 1 个或多个#
  • \s*\w*\s*查找空格+单词+空格的序列 - 这些是零个或多个
  • {.*}查找{后跟至少 1 个字符和结束符}
  • |^[#]+$"#寻找只有一个或多个的行

相关内容