(마크다운이기 때문에)로 시작하는 제목이 있고 #
다음 두 가지 규칙이 있습니다.
- 제목(
#
)가 있어야 한다정확히개행 문자가 포함된 위의 두 줄, 아래의 한 줄 - 부제(
##
,###
등)이 있어야합니다정확히위의 빈 줄과 아래의 빈 줄입니다. - 제목은 자막보다 우선해야 합니다. (두 가지 규칙이 충돌하는 경우 제목 형식을 사용하고 자막을 무시합니다.)
노트:저는 이 세 가지 제한 사항을 충족하지 않는 모든 타이틀을 찾으려고 노력하고 있습니다.
좋은 제목과 나쁜 제목의 예는 다음과 같습니다.
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