Wie ersetze ich leere Zeilen, auf die eine bestimmte Zeichenfolge folgt, durch diese Zeichenfolge?

Wie ersetze ich leere Zeilen, auf die eine bestimmte Zeichenfolge folgt, durch diese Zeichenfolge?

Wie ersetzt man mit sedoder oder was auch immer leere Zeilen, auf die eine bestimmte Zeichenfolge folgt (z. B. oder ), durch diese Zeichenfolge (also oder )?awk&\end{align}&\end{align}

Als Beispiel ist hier die ursprüngliche Datei (bearbeiten: weniger mehrdeutiges Beispiel):

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.

und hier ist, was ich gerne hätte:

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.

Antwort1

GNU sedmit erweiterter Regex-Unterstützung (-E) zur Unterstützung des Regex-Schreibens.

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

Die Idee ist, mit dem Sammeln leerer Zeilen zu beginnen und aufzuhören, wenn eine nicht leere Zeile angezeigt wird. Dann prüft der reguläre Ausdruck, ob auf den Block leerer Zeilen eine der folgenden drei Zeilen folgt:

  • eine Zeile, die mit einem Et-Zeichen beginnt&
  • eine Zeile, die mit \begin{align} beginnt
  • eine Zeile, die mit \end{align} beginnt

Dann löschen wir genau diese Leerzeilen.

Antwort2

Mit pcregrepim Mehrzeilenmodus:

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

greps nach Zeilenanfängen, auf die nicht ein oder mehrere Leerzeichen (einschließlich Zeilenumbruch), der Anfang einer anderen Zeile und entweder &oder folgen \end{align}.

Oder mit perl:

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

Antwort3

Dadurch wirdalleLeere Zeilen im Align-Block:

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

Das Semikolon ist für das BSD-sed auf meinem Mac erforderlich, aber nicht für das GNU-sed.

Es ist schwieriger, bestimmte Blocktypen zuzuordnen. Die direkteste Methode ist

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

verwandte Informationen