否定的な表現を使用するとき、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
置き換えます。ear
a
GNUの場合、sed
anまたはa以外の文字と一致します[^\b]
。\
b
\B
私が知っている文字クラスを使用する代わりに、文字クラスを使用する方法はありません。
GNUサポート\b
とモード。 GNUとBSDは両方とも単語の始まりと終わりで明示的な一致のためのとを持ち、BSDはPOSIXモードと(GNUではない)もサポートします。 POSIXモードは無効にすることはできません(効果はありません)。\B
sed
sed
sed
\<
\>
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
複数の連続した '(または他のすべての場所の ') を含む文字列で ' を正しく置き換えることはできません。これに表示されない方法を確認してください。a
a
banana
bununa
この問題を解決するには、sed
プログラムにループを導入できます。
sed -e :top -e 's/\([[:alnum:]]\)a\([[:alnum:]]\)/\1u\2/g' -e ttop
これは、すべての重なり合うパターンマッチングが処理されるまで、入力ラインで必要なだけ多くの置換を実行します。