Com sed
ou awk
ou 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 sed
com 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 pcregrep
no 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