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

미리보기/뒤돌아보기를 사용할 때 glob 유형 정규식을 넣을 수 없으며 고정 길이 문자열만 사용할 수 있습니다.

grepPCRE 도구를 사용하여 이 작업을 수행 할 수 있습니다 .

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

작동 원리:

  • (?<=#)*최소 1개 이상 찾기#
  • \s*\w*\s*공백 + 단어 + 공백의 순서를 찾으십시오. 이는 0 이상입니다.
  • {.*}{뒤에 최소 1개의 문자와 종결자가 오는 찾기}
  • |^[#]+$"#하나만 있는 행 찾기

관련 정보