如何用该字符串替换后面跟着特定字符串的空行?

如何用该字符串替换后面跟着特定字符串的空行?

使用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

相关内容