¿Cómo reemplazar líneas vacías seguidas de una cadena específica por esta cadena?

¿Cómo reemplazar líneas vacías seguidas de una cadena específica por esta cadena?

Con sedo awko lo que sea, ¿cómo reemplazar líneas vacías seguidas de una cadena específica (por ejemplo &o \end{align}) por esta cadena (por lo tanto &o \end{align})?

Como ejemplo, aquí está el archivo inicial (editar: ejemplo menos ambiguo):

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.

y esto es lo que me gustaría obtener:

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.

Respuesta1

GNU sedcon soporte extendido para expresiones regulares (-E) para ayudar en la escritura de expresiones regulares.

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

La idea es comenzar a recopilar líneas vacías y detenerse cuando se vea una línea no vacía. Luego, la expresión regular comprobará si el fragmento de líneas vacías va seguido de alguna de las siguientes tres líneas:

  • una línea que comienza con un signo comercial&
  • una línea que comienza con \begin{align}
  • una línea que comienza con \end{align}

Luego eliminamos estas líneas vacías específicas.

Respuesta2

Con pcregrepen modo multilínea:

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

greps para inicios de líneas que no van seguidos de uno o más espacios en blanco (incluye nueva línea), el inicio de otra línea y marchitamiento &o \end{align}.

O con perl:

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

Respuesta3

Esto eliminatodolíneas en blanco en el bloque de alineación:

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

El punto y coma es necesario para BSD sed en mi Mac pero no para GNU sed.

Es más complicado hacer coincidir tipos de bloques específicos. El método sencillo es

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

información relacionada