정규식을 기반으로 여러 줄을 연결합니다.

정규식을 기반으로 여러 줄을 연결합니다.

다음과 같이 pandoc의 출력을 HTML로 변환했습니다.

foo

bar

<blockquote>

That's one small step for man, one giant leap for mankind

A new line and another quote

</blockquote>

baz

나는 이것을 다음과 같이 만들고 싶다 :

foo

bar<blockquote>That's one small step for man, one giant leap for mankind

A new line and another quote</blockquote>baz

(블록 인용문은 어쨌든 개별적으로 렌더링되기 때문에 추가 줄 바꿈이 필요하지 않습니다.)

나는 sed로 실험을 시작했고 결국 다음과 같은 결과를 얻었습니다.

'/./ {printf "%s%s", $0, ($1 ~ /^$/ && $2 ~ /<\/?blockquote>/) ? OFS : ORS}'

내가 원하는 것 중 일부를 수행하지만 수정 방법을 이해하기에는 너무 발전된 단계입니다.

즉, 내가 원하는 규칙은 다음 줄이 비어 있고 그 뒤의 줄이 일치하는 경우 /<\/?blockquote>/현재 줄, 다음 줄, 그 다음 줄을 구분 기호 없이 인쇄하고 계속하는 것입니다.

답변1

GNU awk를 사용하여 전체 파일을 메모리로 한 번에 읽지 않고 여러 문자 RS, RTgensub()를 처리합니다 .\s

$ awk -v RS='\\s*</?blockquote>\\s*' '{ORS=gensub(/\s+/,"","g",RT)} 1' file
foo

bar<blockquote>That's one small step for man, one giant leap for mankind

A new line and another quote</blockquote>baz

답변2

다음을 사용하는 단일 라인 Perl:

>= 5.36:

$ perl -gpe 's/(\w+)\n\n(</?blockquote\b[^\n]+)\s*\n/$1$2/g' file 

또는 < 5.36:

$ perl -0777 -pe 's/(\w+)\n\n(</?blockquote\b[^\n]+)\s*\n/$1$2/g' file 
foo<blockquote>That's one small step for man, one giant leap for mankind

A new line and another quote</blockquote>bar

  • -g또는 -0777메모리의 전체 파일을 읽습니다.
  • 's///'뼈대를 교체하는 것입니다.sed
  • $1$2두 개의 캡처된 그룹이 있습니다 \1\2.sed

정규식 일치는 다음과 같습니다.

마디 설명하다
( $1을 그룹화하고 캡처합니다.
\w+ 단어 문자(az, AZ, 0-9, _)(1회 이상(최대한 많이 일치))
) $1에 종료
\n '\n'(개행 문자)
\n '\n'(개행 문자)
( $2를 그룹화하고 캡처합니다.
</?blockquote '<' + 선택사항 '/' + '블록 인용'
\b 단어 경계 앵커
[^\n]+ 다음을 제외한 모든 문자: '\n'(개행)(1회 이상(최대한 많이 일치))
) $2에 종료
\s* 공백(\n, \r, \t, \f 및 " ")(0회 이상(최대한 일치))
\n '\n'(개행 문자)

답변3

awk 'BEGIN { waiting_for_tag=1; };
     NF==0 { next; };
     $1 ~ "</?blockquote>" { printf "%s",$1; waiting_for_tag=0; next; };
     waiting_for_tag==1 { printf "%s",$0; next; }; 
     { printf "%s\n",$0; waiting_for_tag=1; }' input
foo<blockquote>That's one small step for man, one giant leap for mankind
A new line and another quote</blockquote>bar

관련 정보