使用sed
or或其他什么,如何用该字符串(因此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