特定の文字列が続く空行をこの文字列に置き換えるにはどうすればよいでしょうか?

特定の文字列が続く空行をこの文字列に置き換えるにはどうすればよいでしょうか?

sedまたはまたは などを使用してawk、特定の文字列 (たとえば&または\end{align}) が続く空行をこの文字列 (つまり&または\end{align}) に置き換えるにはどうすればよいでしょうか。

例として、初期ファイル(編集: より曖昧さが少ない例):

The quick brown fox jumps over the sleazy dog.

Indeed, the quick brown fox jumps over the sleazy dog.

\begin{align}


& foo

& bar

\end{align}

The quick brown fox jumps over the sleazy dog.

Indeed, the quick brown fox jumps over the sleazy dog.

私が欲しいものは次のとおりです:

The quick brown fox jumps over the sleazy dog.

Indeed, the quick brown fox jumps over the sleazy dog.

\begin{align}
& foo
& bar
\end{align}

The quick brown fox jumps over the sleazy dog.

Indeed, the quick brown fox jumps over the sleazy dog.

答え1

GNU sed正規表現の記述を支援する拡張正規表現サポート (-E) を備えています。

sed -Ei -e '
  /./b
  :a
    $q;N
  /\n$/ba
  s/^\n+(&|\\(begin|end)\{align\})/\1/
' file

アイデアとしては、空行の収集を開始し、空でない行が見つかったら停止します。次に、正規表現は、空行のチャンクの後に次の 3 行のいずれかが続くかどうかをチェックします。

  • アンパサンドで始まる行&
  • \begin{align}で始まる行
  • \end{align}で始まる行

次に、これらの特定の空行を削除します。

答え2

複数行モードではpcregrep:

pcregrep -M '^(?!\s+^(&|\Q\end{align}\E))' < file

1 つ以上の空白 (改行を含む) が続かない行の先頭、別の行の先頭、および witter または を grep し&ます\end{align}

または、以下を使用しますperl:

perl -0777 -pe 's/^\s+^(&|\Q\end{align}\E)/$1/gm' < file

答え3

これにより、全てalign ブロック内の空白行:

sed '/\\begin/,/\\end/ { /^$/d; }' file

私の Mac 上の BSD sed ではセミコロンが必要ですが、GNU sed では必要ありません。

特定のブロックタイプを一致させるのはより難しいです。簡単な方法は

sed '
  /\\begin{align}/,/\\end{align}/ { /^$/d; }
  /\\begin{equation}/,/\\end{equation}/ { /^$/d; }
' file

関連情報