如何用該字串替換後面跟著特定字串的空白行?

如何用該字串替換後面跟著特定字串的空白行?

使用sedor或其他什麼,如何用該字串(因此or )awk替換後面接著特定字串(例如&or )的空白行?\end{align}&\end{align}

作為範例,這是初始文件(編輯:不太模糊的例子):

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.

這就是我想要得到的:

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.

答案1

GNU sed具有擴展正則表達式支援(-E)以幫助正規表示式編寫。

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

想法是開始收集空行,並在看到非空白行時停止。然後正規表示式將檢查空白行塊後面是否跟隨以下三行之一:

  • 以 & 符號開頭的行&
  • 以 \begin{align} 開頭的行
  • 以 \end{align} 開頭的行

然後我們刪除這些特定的空白行。

答案2

在多行模式下pcregrep

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

grep 找出後面沒有一個或多個空格(包括換行符號)的行的開頭、另一行的開頭以及 wither&\end{align}.

或與perl

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

答案3

這刪除了全部對齊區塊中的空白行:

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

我的 Mac 上的 BSD sed 需要分號,但 GNU sed 不需要。

匹配特定的區塊類型比較棘手。最直接的方法是

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

相關內容