我有数百个文档,其中每个标题的形式如下:
# 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 个字符和结束符}
|^[#]+$"
#
寻找只有一个或多个的行