sed 単語の境界はコロン文字で動作しません

sed 単語の境界はコロン文字で動作しません

次のファイルがあります

> cat tmp
"aaa"
"aaa:xyz"

希望の出力は

"bbb"
"aaa:xyz"

次のsedコマンドを使用しています

sed "s/\baaa\b/bbb/" tmp

しかし、このコマンドを使用すると

"bbb"
"bbb:xyz"

コロン文字は単語の境界として扱われるようです。最初の行だけを変更し、2番目の行を変更せずに目的の出力を取得するにはどうすればよいですか?私は以下を試しましたが、うまくいきませんでした

sed "s/\Baaa\B/bbb/" tmp
sed "s/\baaa\B/bbb/" tmp
sed "s/\Baaa\b/bbb/" tmp

編集:以下のように、同じファイルに対して別のsedコマンドを使用する必要がありました。

's/aaa:xyz/ttt/' tmp

したがって、コロンがない場合にのみ置換を実行できます。行にコロンがあるかどうかにかかわらず、交換を実行できる必要があります。

ベストアンサー1

GNU\b幅0の単語境界モードは、単語文字と単語以外の文字を一致させます。 「単語文字」は通常、英数字と下線(_)です。これは\b文字列と 。の間に一致があることを意味します。aaa:aaa:

以下は、\bすべての一致を次に置き換えて、サンプル文書で一致が発生する場所を示しています。\b*

$ sed 's/\b/*/g' file
"*aaa*"
"*aaa*:*xyz*"

すべてのインスタンスを"aaa"次に置き換える"bbb"には

$ sed 's/"aaa"/"bbb"/g' file
"bbb"
"aaa:xyz"

すべてを変える性格 aaabbbコロンを含まないすべての行に使用してください。

$ sed '/:/!s/\baaa\b/bbb/g' file
"bbb"
"aaa:xyz"

aaa後にコロンが来ない単語を次に置き換えるにはbbb:

$ sed -e 's/\baaa\([^:]\)/bbb\1/g' -e 's/\baaa$/bbb/' file
"bbb"
"aaa:xyz"

ここで最初の代替に注意してください。必要aaa部分文字列を表します。はい次は別のキャラクターが出てきます。これはaaa、行末の部分文字列が置き換えられないことを意味します。これが、このケースに別々の交換品を用意した理由です。

おすすめ記事