16

ファイル内の角かっこのすべてのペアを置き換えたい、たとえば、[some text]\macro{some text}たとえば:

This is some [text].
This [line] has [some more] text.

これは次のようになります。

This is some \macro{text}.
This \macro{line} has \macro{some more} text.
  • ペアは個々の行でのみ発生し、複数の行にまたがることはありません。
  • 1 つの行に複数のペアが存在する場合もありますが、ネストされることはありません。
  • ブラケットが 1 行に 1 つしかなく、ペアになっていない場合は、変更しないでください。

これらのブラケットのペアをこのコードに置き換えるにはどうすればよいですか?

4

4 に答える 4

33

少し手間がかかりましたが、次のとおりです。

sed -i.bkup  's/\[\([^]]*\)\]/\\macro{\1}/g' test.txt

この正規表現を説明できるかどうか見てみましょう。

  1. \[角かっこに一致します。は有効なマジック正規表現文字であるため[、バックスラッシュはリテラル文字に一致することを意味します。
  2. \(...\)キャプチャ グループです。必要な正規表現の一部をキャプチャします。多くのキャプチャ グループを持つことがsedでき、それらを 、 などとして参照でき\1ます\2
  3. キャプチャ グループ内\(...\)。私は持ってい[^]]*ます。
    1. [^...]構文は、任意の文字を意味します。
    2. [^]]、右中括弧以外の任意の文字を意味します。
    3. は、前の*ものの 0 個以上を意味します。つまり、角括弧を閉じていない 0 個以上の文字をキャプチャしています。
  4. \]閉じ角括弧を意味します

行を見てみましょうthis is [some] more [text]

  • 上記の #1 では、単語someの前にある最初の開き角括弧をキャプチャします。ただし、キャプチャ グループには含まれていません。これは私が代用する最初のキャラクターです。
  • 私は今、キャプチャ グループを開始します。上記の 3.2 および 3.3 に従って、角括弧を閉じていないできるだけ多くの文字の文字から始めてキャプチャしいますs。これは、私が一致していることを意味しますが、キャプチャのみです。[somesome
  • #4 で、キャプチャ グループを終了しました。置換目的[someで一致させましたが、現在は最後の右角かっこで一致させています。つまり、私は一致して[some]います。正規表現は通常貪欲であることに注意してください。なぜこれが重要なのか、以下で説明します。
  • これで、置換文字列を照合できます。これははるかに簡単です。です\\macro(\1)。は\1、キャプチャ グループに置き換えられます。は\\単なるバックスラッシュです。したがって、私は に置き換え[some]ます\macro{some}

各行に 1 セットの角かっこが含まれていることが保証されていれば、はるかに簡単になります。次に、これを行うことができました:

sed -i.bkup 's/\[\(.*\)\]/\\macro(\1)/g'

キャプチャ グループは現在、角かっこの間で何かを言っています。ただし、問題は、正規表現が貪欲であることです。つまり、テキストの insからsomefinal までずっと一致していたでしょう。t以下の「x」はキャプチャ グループを示します。[とは]、一致している角括弧を示しています。

 this is [some] more [text]
         [xxxxxxxxxxxxxxxx]

正規表現にとって特別な意味を持つ文字に一致させる必要があったため、これはより複雑になりました。さらに、正規表現の貪欲さを考慮しなければなりませんでした。これにより、見栄えの良い一致[^]]*しない文字列が閉じ括弧以外のものと一致するようになりました。の前後に角括弧を追加し、キャプチャ グループ\[[^]]*\]を忘れないでください。正規表現の混乱が 1 つ発生します。\(...\)\[\([^]]*\)\]

于 2012-05-18T04:59:31.367 に答える
16
sed -e 's/\[\([^]]*\)\]/\\macro{\1}/g' file.txt

これは、開き括弧、明示的に閉じていない任意の数の括弧、そして閉じ括弧を探します。グループは括弧によってキャプチャされ、置換式に挿入されます。

于 2012-05-18T04:02:27.760 に答える
4

グループを使用する

sed 's|\[\([^]]*\)\]|\\macro{\1}|g' file
于 2012-05-18T04:01:50.740 に答える
2

次の式はパターンに一致し、[a-z, A-Z and space]それを\macro{<whatever was between the []>}

sed -e 's/\[\([a-zA-Z ]*\)\]/\\macro{\1}/g'

式では、\( ... \)後の置換で次のように参照できる一致グループを形成します。\1

于 2012-05-18T04:01:48.490 に答える