Como substituir linhas vazias seguidas de uma string específica por esta string?

Como substituir linhas vazias seguidas de uma string específica por esta string?

Com sedou awkou qualquer outra coisa, como substituir linhas vazias seguidas por uma string específica (por exemplo &ou \end{align}) por esta string (portanto &ou \end{align})?

Como exemplo, aqui está o arquivo inicial (editar: exemplo menos ambíguo):

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.

e aqui está o que eu gostaria de obter:

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.

Responder1

GNU sedcom suporte estendido a regex (-E) para auxiliar na escrita de regex.

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

A ideia é começar a coletar linhas vazias e parar quando uma linha não vazia for vista. Em seguida, a regex verificará se o pedaço de linhas vazias é seguido por qualquer uma das três linhas a seguir:

  • uma linha começando com um e comercial&
  • uma linha começando com \begin{align}
  • uma linha começando com \end{align}

Em seguida, excluímos essas linhas vazias específicas.

Responder2

Com pcregrepno modo multilinha:

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

greps para inícios de linhas que não são seguidos por um ou mais espaços em branco (inclui nova linha), o início de outra linha e murchar &ou \end{align}.

Ou com perl:

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

Responder3

Isso removetodoslinhas em branco no bloco de alinhamento:

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

O ponto e vírgula é necessário para o sed BSD no meu Mac, mas não para o sed GNU.

É mais complicado combinar tipos de blocos específicos. O método direto é

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

informação relacionada