Usando o grep para identificar títulos incorretos

1

Tenho várias centenas de documentos em que cada título é da forma:

# Some title here {.WORD} 

Eu quero identificar usando grep todos os títulos que não seguem esse padrão. No entanto, as linhas que começam com apenas # não devem ser detectadas.

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

Eu escrevi o seguinte regexp para resolver esta situação

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

No entanto, o analisador reclama sobre "asserção lookbehind não tem comprimento fixo" Como, posso corrigir a expressão regex acima para remediar isso?

    
por N3buchadnezzar 14.07.2018 / 15:36

2 respostas

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

A expressão regular estendida corresponde a linhas "OK". Com -v , pedimos para ver as linhas que não correspondem.

O padrão requer que a linha comece com algum número de caracteres # . O resto da linha é opcional, mas se existir, ela deve começar com um espaço, então conter um número de letras, possivelmente com espaços intermediários e um espaço final antes de { . A parte dentro de { e } deve começar com um ponto e pode conter um certo número de letras e espaços.

    
por 14.07.2018 / 17:29
1

Ao usar lookaheads / lookbehinds, você não pode colocar qualquer tipo de regex dentro deles, eles podem ser apenas strings de comprimento fixo.

Você pode usar o recurso PCRE de grep fazer isso:

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

Como isso funciona:

  • (?<=#)* procura pelo menos 1 ou mais #
  • \s*\w*\s* procura uma sequência de espaço + palavra + espaço - estes são zero ou mais
  • {.*} procura { seguido por pelo menos 1 caractere e um fechamento }
  • |^[#]+$" procura por uma linha com apenas # ou mais
por 14.07.2018 / 17:14