sed
またはまたは などを使用してawk
、特定の文字列 (たとえば&
または\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
アイデアとしては、空行の収集を開始し、空でない行が見つかったら停止します。次に、正規表現は、空行のチャンクの後に次の 3 行のいずれかが続くかどうかをチェックします。
- アンパサンドで始まる行
&
- \begin{align}で始まる行
- \end{align}で始まる行
次に、これらの特定の空行を削除します。
答え2
複数行モードではpcregrep
:
pcregrep -M '^(?!\s+^(&|\Q\end{align}\E))' < file
1 つ以上の空白 (改行を含む) が続かない行の先頭、別の行の先頭、および witter または を grep し&
ます\end{align}
。
または、以下を使用しますperl
:
perl -0777 -pe 's/^\s+^(&|\Q\end{align}\E)/$1/gm' < file
答え3
これにより、全てalign ブロック内の空白行:
sed '/\\begin/,/\\end/ { /^$/d; }' file
私の Mac 上の BSD sed ではセミコロンが必要ですが、GNU sed では必要ありません。
特定のブロックタイプを一致させるのはより難しいです。簡単な方法は
sed '
/\\begin{align}/,/\\end{align}/ { /^$/d; }
/\\begin{equation}/,/\\end{equation}/ { /^$/d; }
' file