다음과 같이 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
, RT
및 gensub()
를 처리합니다 .\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