正規表現に基づいて複数行を連結します。

正規表現に基づいて複数行を連結します。

次のように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を使用して、ファイル全体をメモリに一度に読み取ることなく複数の文字RSRTおよび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$22つのキャプチャされたグループがあります\1\2sed

正規表現の一致は次のとおりです。

説明する
( $ 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

関連情報