他の文字列の部分文字列ではなく文字列の検索と置換

他の文字列の部分文字列ではなく文字列の検索と置換

次の代替リストがあります。

search_and -> replace
big_boy -> bb
little_boy -> lb
good_dog -> gd
...

上記を変更する必要がありますが、同時に次のように長い文字列を一致させることは避けてください。

big_boys
good_little_boy

私はこれを試しました:

sed -i -r "s/$(\W){search}(\W)/$\1{replacement}\2/g"

ただし、次のように文字列(この場合は「good_dog」)が行の末尾に表示される場合、上記の方法は機能しません。

Mary had a 'little_boy', good_little_boy, $big_boy, big_boys and good_dog

Mary had a 'lb', good_little_boy, $bb, big_boys and good_dog

文字列が行の先頭にも現れると、上記の内容が機能するかどうか疑われます。見つけて交換する良い方法はありますか?

ベストアンサー1

GNU sedを使用している場合(過度の露出は使用中であること-iを示します)「単語の境界」エスケープ\b:

sed -i "s/\b$SEARCH\b/$REPLACE/g"

\b単語の境界の正確な一致:一方の文字は「単語」文字ですが、他方の文字はそうではありません。幅が0の一致なので、sum\1値を保存するためにサブグループキャプチャを使用する必要はありません\2\B正反対の別のものがあります。


GNU sedを使用していない場合は、キャプチャサブモードで行の先頭と末尾を交互に使用できます(\W|^)。これは、単語ではない文字または行の先頭と一致し、単語で(\W|$)はない文字または行の終わりと一致します。この場合も\1and をそのまま使用します。とにかく、\2GNU以外の製品は少なくとも拡張モードでsedそれをサポートしているので、とにかく試してみる価値があります。\b

おすすめ記事