次のように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
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