Wie ersetzt man mit sed
oder 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 sed
mit 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 pcregrep
im 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