1

次の文字列で「bar」が続く場合を除いて、sedの各「foo」インスタンスと一致させる方法を知っている人はいますか?

'foo boo foo foo bar foo foo foo'

望ましい結果(太字の一致したインスタンス)

' MaTcHeD       boo      MaTcHeD    foo bar MaTcHeD     MaTcHeD          MaTcHeD '

大量のテストの後、私は次のことを発見しました。

sed -e "s/foo\( *\)bar/FOO\1BAR/g" -e "s/foo/MaTcHeD/g" -e "s/FOO\( *\)BAR/foo\1bar/g"

これは、最初に「foo bar」インスタンスを照合し、それらを一時的な文字列(ここでは「FOOBAR」)に置き換え、次に残りの「foo」インスタンスを照合してから、「foobar」インスタンスを元のバージョンに「戻す」ことで構成されます。 ..(私ははっきりしているといいのですが...)

しかし、とにかくこれはまったくきれいではありません。今のところ見つけられなかったとしても、これ以上簡単な方法がないことに驚かされます。

ヒントをいただければ幸いです。:-)

どうもありがとうございます、

4

1 に答える 1

0

に固執する必要がある場合はsed、アイデアは問題ありません。ただし、元の文字列に が含まれているFOO BAR場合、ソリューションは失敗します。常に適切な一時文字列を選択する必要があります。スクリプトが安全ではなくなります。

通常の文字列を一時文字列として選択するのではなく、目に見えない文字列を選択することで改善できます。

たとえば、次の行は機能します。

sed -r 's/foo( *)bar/\x94\1\x98/g; s/foo/Matched/g;s/\x94( *)\x98/foo\1bar/g' file
于 2013-03-01T15:24:46.933 に答える