複数置換のためのedのサブ式

複数置換のためのedのサブ式

次のようなテキストがあるとしましょう。

John went with Sally to the market where they bought fresh bread. There they met with Jim and dined together.

次のように、John、Sally、Jimという名前をプラス記号で囲む正規表現を作成するとします。

+John+ went with +Sally+ to the market where they bought fresh bread. There they met with +Jim+ and dined together.

名前を +John+ に正常に変更する次の正規表現を作成しました。

g/\(.*\)\(\<John\>\)\(.*\)/s//\1+\2+\3/gp

コマンドを再実行する必要なく、一度に3つの名前をすべて変更する名前を作成したいと思います。

次のような単純な複数の交換を試みました。

g/John/s//+&+/\
s/Sally/+&+/\
s/Jim/+&+/p

ただし、これは各名前の最初のインスタンスのみを変更します。

答え1

編集コマンドは次のとおりです。ほぼ正しい。

g/./ s/John/+&+/g\
s/Sally/+&+/g\
s/Jim/+&+/gp

これには2つの主な変更があります。

  1. このコマンドで使用される正規表現は、gコマンドのリストを適用するすべての行と一致する必要があります。を使用しましたが、これはJohn同じ行に行かなければSallyに変更されないことを意味します。+Sally+John

    .ここでは空でないすべての行を選択するために使用しますが、たとえば^$みんなワイヤー。この方法を使用すると、...文字列Jim(3つの名前のうち最も短い名前)を含むのに十分な長い行を選択する方が合理的です。

  2. g旗を使っています。s///すべての行で重複しないすべての項目を置き換える3つのコマンドのうちの1つです。私はgp最後の置換を使用していますが、コマンドの効果を見るために直接行うからです。

同様の文字列と区別する必要があり、\<John\>システムCライブラリの基本 Regular Expressions(BRE)がそれをサポートしている場合は、代わりにinを使用してください(これはBREで(変更)を使用するのと同じ標準ではありませんが、これを使用してGNUシステムに書き込むことができます。 )JohnJohnny\|g/./ s/John\|Sally\|Jim/+&+/gp

答え2

どうですか?

1,$g/./s/John/+&+/g;s/Sally/+&+/g;s/Jim/+&+/g

最初にサフィックスsがありますg。このように2番目に入れると、各代替項目は最初の項目だけでなく、発生するすべての操作を実行します。

関連情報