pcregrep은 주변 공백이 있는 줄을 찾습니다.

pcregrep은 주변 공백이 있는 줄을 찾습니다.

(마크다운이기 때문에)로 시작하는 제목이 있고 #다음 두 가지 규칙이 있습니다.

  • 제목( #)가 있어야 한다정확히개행 문자가 포함된 위의 두 줄, 아래의 한 줄
  • 부제( ##, ###등)이 있어야합니다정확히위의 빈 줄과 아래의 빈 줄입니다.
  • 제목은 자막보다 우선해야 합니다. (두 가지 규칙이 충돌하는 경우 제목 형식을 사용하고 자막을 무시합니다.)

노트:저는 이 세 가지 제한 사항을 충족하지 않는 모든 타이틀을 찾으려고 노력하고 있습니다.

좋은 제목과 나쁜 제목의 예는 다음과 같습니다.

some text 
# Title     | BAD 

## Subtitle | Good (Has two spaces below, is needed for next main title)


# Title     | Good

## Subtitle | Bad
text  

# Title     | Bad

text

정규식을 가지고 놀다가 다음과 같은 표현을 생각해냈습니다.

메인 타이틀:정규식

((?<=\n{4})|(?<=.\n{2})|(?<=.\n))(# .*)|(# .*)(?=(\n.|\n{3}(?!# )|\n{4}))

부제:정규식

'((?<=\n{3})|(?<=.\n))(##+.*)|(##+.*)(?=\n.|\n{3}(?!# )|\n{4}.)'

그러나 나를 정말 혼란스럽게 하는 것은 그들이 와 함께 작동하지 않는다는 것입니다 pcregrep. 내가 실행하려는 명령은 다음과 같습니다 pcgrep(완전성을 위해).

$ pcregrep -rniM --include='.*\.md' \
     '((?<=\n{3})|(?<=.\n))(##+.*)|(##+.*)(?=\n.|\n{3}(?!# )|\n{4}.)' \
     ~/Programming/oppgaver/src/web

하나의 파일만 검색하려고 할 때에도 작동하지 않으며 잘 작동하는 다른 표현식이 여러 개 있습니다.

나한테 무슨 문제라도 있는 걸까?정규식, 아니면 버그가 있는 구현인가요?

답변1

이 솔루션은 잘못된 헤더를 모두 수정합니다.

sed -r '
    :loop; N; $!b loop

    s/\n+(#[^\n]+)/\n\n\1/g

    s/(#[^\n]+)\n+/\1\n\n/g

    s/\n+(#[^\n#]+)/\n\n\n\1/g
' input.txt;

추가 댓글:

sed -r '
    ### put all file into the pattern space,
    # in other words, merge all lines into one line
    :loop; N; $!b loop;

    ### first traversal of the pattern space
    # searches the line with "#" sign (all cases matches - Titles, SubTitles, etc),
    # takes all its upper empty lines
    # and converts them to the one empty line 
    s/\n+(#[^\n]+)/\n\n\1/g;


    ### second traversal of the pattern space
    # again, searches the line with "#" sign, take all its bottom empty lines
    # and converts them to the one empty line 
    s/(#[^\n]+)\n+/\1\n\n/g;

    ### third traversal of the pattern space
    # searches the single "#" sign (Titles only),
    # takes all its upper newlines (at this moment only two of them are there,
    # because of previous substitutions) 
    # and converts them to three newlines 
    s/\n+(#[^\n#]+)/\n\n\n\1/g
' input.txt

입력하다

text
# Title
## SubTitle
### SubSubTitle
# Title
## SubTitle
text
### SubSubTitle
# Title
# Title
# Title
## SubTitle
### SubSubTitle

산출

text


# Title

## SubTitle

### SubSubTitle


# Title

## SubTitle

text

### SubSubTitle


# Title


# Title


# Title

## SubTitle

### SubSubTitle

관련 정보