入れ子になった中かっこを含めることができる中かっこコンテンツを区切ります。

入れ子になった中かっこを含めることができる中かっこコンテンツを区切ります。

TeXファイルには次のコマンドがあり、\q{aaa}{blablabla}パラメータを分離したいと思いますblablabla。私はsedを使ってそれを見つけました。

sed 's/\q{([^}\{])}{([^}\{])}/\2/g'

そしてそれは素晴らしい作品です。

問題はある時入れ子になったパターンに合わせて校正器内の校正器を維持したいです。つまり、

\q{aaa}{blablabla \label{BBB}}

希望の出力は

blablabla \label{BBB}

たとえば、継続したい複数のLaTeXコマンドを想像できます。

\q{aaa}{blablabla \label{BBB} blablabla \includegraphics{ccc.eps} blablabla \cite{somebody_year} blablabla 
\begin{itemize}
\item AAA
\item BBB
\end{itemize}
blablabla to conclude}

この極端なMWEの予想結果は次のとおりです。

blablabla \label{BBB} blablabla \includegraphics{ccc.eps} blablabla \cite{somebody_year} blablabla 
\begin{itemize}
\item AAA
\item BBB
\end{itemize}
blablabla to conclude

これらの例は非常に(おそらくあまりにも)複雑な例です。なぜなら、私の検索の最終目標は、(レビュープロセス中)原稿修正を最適化することです。

一行でできるかはわかりませんがsed

ベストアンサー1

正規正規表現はこれを実行できません。バランスの取れた括弧が必要な言語はそうではありません。正規言語正式な意味で。そのため、この操作を正しく実行できませんsed。幸いなことに、Perlのようなものは実際には正規言語に限定されない正規表現を提供します。

たとえば、この嫌な行動(SOへの回答で修正)角かっこに一致する正規表現)あなたがしたいことをしているようです:

perl -0 -lne 'print "$2\n\n" while m/ \\q\{aaa\} ( \{ ( (?: [^}{]+ | (?1))*+ ) \} )/gx '

入力が\q{aaa}{blablabla \label{BBB}} \foo{bar}{not this} \q{aaa}{bleh}出力を与える

blablabla \label{BBB}

bleh

つまり、一致する部分の間に2つの改行文字が印刷されます。上記のように、-0複数行のラベルでも機能する必要があります。ラベル全体を取得するprint $2ために変更することもできます。print $&\q{aaa}{...}

これが基本的に行うことは、先頭が\\q\{aaa\}タグの定数部分と一致し、内部部分が中(?: [^}{]+ | (?1))*+括弧のない文字列であるか、または最初のキャプチャグループ項目(角括弧セット)で繰り返し一致できる項目と一致することです。中のものと一致する校正器のペア。

.../ \\q\{aaa\} ( \{ ( (?: [^}{]+ | (?1))*+ ) \} )/ '
                ^1   ^2               |     ^2   ^1
                |                     |          |
                +---------------------+----------+ 
                        recurse to group 1

2番目のキャプチャグループは、出力の一部をキャプチャするために使用されます。

おすすめ記事