少し手間がかかりましたが、次のとおりです。
sed -i.bkup 's/\[\([^]]*\)\]/\\macro{\1}/g' test.txt
この正規表現を説明できるかどうか見てみましょう。
- は
\[
角かっこに一致します。は有効なマジック正規表現文字であるため[
、バックスラッシュはリテラル文字に一致することを意味します。
- は
\(...\)
キャプチャ グループです。必要な正規表現の一部をキャプチャします。多くのキャプチャ グループを持つことがsed
でき、それらを 、 などとして参照でき\1
ます\2
。
- キャプチャ グループ内
\(...\)
。私は持ってい[^]]*
ます。
[^...]
構文は、任意の文字を意味します。
- は
[^]]
、右中括弧以外の任意の文字を意味します。
- は、前の
*
ものの 0 個以上を意味します。つまり、角括弧を閉じていない 0 個以上の文字をキャプチャしています。
- は
\]
閉じ角括弧を意味します
行を見てみましょうthis is [some] more [text]
- 上記の #1 では、単語someの前にある最初の開き角括弧をキャプチャします。ただし、キャプチャ グループには含まれていません。これは私が代用する最初のキャラクターです。
- 私は今、キャプチャ グループを開始します。上記の 3.2 および 3.3 に従って、角括弧を閉じていないできるだけ多くの文字の文字から始めてキャプチャしています
s
。これは、私が一致していることを意味しますが、キャプチャのみです。[some
some
- #4 で、キャプチャ グループを終了しました。置換目的
[some
で一致させましたが、現在は最後の右角かっこで一致させています。つまり、私は一致して[some]
います。正規表現は通常貪欲であることに注意してください。なぜこれが重要なのか、以下で説明します。
- これで、置換文字列を照合できます。これははるかに簡単です。です
\\macro(\1)
。は\1
、キャプチャ グループに置き換えられます。は\\
単なるバックスラッシュです。したがって、私は に置き換え[some]
ます\macro{some}
。
各行に 1 セットの角かっこが含まれていることが保証されていれば、はるかに簡単になります。次に、これを行うことができました:
sed -i.bkup 's/\[\(.*\)\]/\\macro(\1)/g'
キャプチャ グループは現在、角かっこの間で何かを言っています。ただし、問題は、正規表現が貪欲であることです。つまり、テキストの ins
からsome
final までずっと一致していたでしょう。t
以下の「x」はキャプチャ グループを示します。[
とは]
、一致している角括弧を示しています。
this is [some] more [text]
[xxxxxxxxxxxxxxxx]
正規表現にとって特別な意味を持つ文字に一致させる必要があったため、これはより複雑になりました。さらに、正規表現の貪欲さを考慮しなければなりませんでした。これにより、見栄えの良い一致[^]]*
しない文字列が閉じ括弧以外のものと一致するようになりました。の前後に角括弧を追加し、キャプチャ グループ\[[^]]*\]
を忘れないでください。正規表現の混乱が 1 つ発生します。\(...\)
\[\([^]]*\)\]