각 헤더의 형식이 다음과 같은 수백 개의 문서가 있습니다.
# 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 유형 정규식을 넣을 수 없으며 고정 길이 문자열만 사용할 수 있습니다.
grep
PCRE 도구를 사용하여 이 작업을 수행 할 수 있습니다 .
$ grep -vP "(?<=#)*\s*\w*\s*{.*}|^[#]+$" afile
# Lorem .tip}
# LIPSUM {.tip
# Title
작동 원리:
(?<=#)*
최소 1개 이상 찾기#
\s*\w*\s*
공백 + 단어 + 공백의 순서를 찾으십시오. 이는 0 이상입니다.{.*}
{
뒤에 최소 1개의 문자와 종결자가 오는 찾기}
|^[#]+$"
#
하나만 있는 행 찾기