sedのアンカー文字[^]

sedのアンカー文字[^]

否定的な表現を使用するとき、sedが[^ ]アンカー文字を\b実際の文字として扱うのはなぜですか\B?たとえば、次の式は同じ結果を生成すると予想できますが、そうではありません。

$ echo 'apple pear melon banana cherry papaya' | sed 's/[^\b]a[^\b]/u/g'
apple pu melon baua cherry uaya
$ echo 'apple pear melon banana cherry papaya' | sed 's/\Ba\B/u/g'
apple peur melon bununa cherry pupuya

そうでなければ、\Bどうやってそれを否定できますか\b

ベストアンサー1

\bまたは\B文字ではありません。どちらも一致する幅がゼロのパターンです。〜サイ数値。

パターン\bは、単語の境界、つまり「単語文字」である文字と「単語文字」ではない文字との間で一致します。

この\Bパターンは、単語ではなく境界、すなわち「単語文字」であるか、または2つの文字の間で一致する。

パターン[^\b]マッチングキャラクター。そのため、pearに変換するには(および周囲の文字)をpu置き換えます。eara

GNUの場合、sedanまたはa以外の文字と一致します[^\b]\b

\B私が知っている文字クラスを使用する代わりに、文字クラスを使用する方法はありません。

GNUサポート\bとモード。 GNUとBSDは両方とも単語の始まりと終わりで明示的な一致のためのとを持ち、BSDはPOSIXモードと(GNUではない)もサポートします。 POSIXモードは無効にすることはできません(効果はありません)。\Bsedsedsed\<\>sed[[:<:]][[:>:]]sed[^[:>:]]

1つ取得するには似たようなEffectを使用する代わりに、\B次のものを使用できます。

$ echo 'apple pear melon banana cherry papaya' | sed 's/\([[:alnum:]]\)a\([[:alnum:]]\)/\1u\2/g'
apple peur melon bunana cherry pupaya

つまり、両方の英数字を一致させ、次のa代替文字に2つの横の文字を含めます。置換は重複しない一致内でのみ発生するため、a複数の連続した '(または他のすべての場所の ') を含む文字列で ' を正しく置き換えることはできません。これに表示されない方法を確認してください。aabananabununa

この問題を解決するには、sedプログラムにループを導入できます。

sed -e :top -e 's/\([[:alnum:]]\)a\([[:alnum:]]\)/\1u\2/g' -e ttop

これは、すべての重なり合うパターンマッチングが処理されるまで、入力ラインで必要なだけ多くの置換を実行します。

おすすめ記事