これは、sedを使用して複数文字列の貪欲でないマッチングを確実に行う方法です。あなたは、すべてを変更したいとしましょうfoo...bar
に<foo...bar>
例えばので、この入力を:
$ cat file
ABC foo DEF bar GHI foo KLM bar NOP foo QRS bar TUV
この出力になるはずです:
ABC <foo DEF bar> GHI <foo KLM bar> NOP <foo QRS bar> TUV
これを行うには、fooとbarを個々の文字に変換し、それらの間のそれらの文字の否定を使用します。
$ sed 's/@/@A/g; s/{/@B/g; s/}/@C/g; s/foo/{/g; s/bar/}/g; s/{[^{}]*}/<&>/g; s/}/bar/g; s/{/foo/g; s/@C/}/g; s/@B/{/g; s/@A/@/g' file
ABC <foo DEF bar> GHI <foo KLM bar> NOP <foo QRS bar> TUV
上記では:
s/@/@A/g; s/{/@B/g; s/}/@C/g
変換される{
と}
、それらの文字は、次に変換するために利用可能であるので、入力に存在することができないプレースホルダストリングへfoo
とbar
します。
s/foo/{/g; s/bar/}/g
とそれぞれに変換foo
しbar
ています{
}
s/{[^{}]*}/<&>/g
希望する操作を実行しています-に変換foo...bar
しています<foo...bar>
s/}/bar/g; s/{/foo/g
変換される{
と}
バックにfoo
してbar
。
s/@C/}/g; s/@B/{/g; s/@A/@/g
プレースホルダー文字列を元の文字に変換しています。
上記は、最初のステップでそのような文字列を作成するため、入力に存在しない特定の文字列に依存せず{[^{}]*}
、必要に応じて何回でも使用できるため、一致させる特定の正規表現の発生を気にしないことに注意してください必要な実際の一致を分離する式、および/またはseds数値一致演算子を使用して、たとえば2番目の出現のみを置き換える
$ sed 's/@/@A/g; s/{/@B/g; s/}/@C/g; s/foo/{/g; s/bar/}/g; s/{[^{}]*}/<&>/2; s/}/bar/g; s/{/foo/g; s/@C/}/g; s/@B/{/g; s/@A/@/g' file
ABC foo DEF bar GHI <foo KLM bar> NOP foo QRS bar TUV