次の代替リストがあります。
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|$)
はない文字または行の終わりと一致します。この場合も\1
and をそのまま使用します。とにかく、\2
GNU以外の製品は少なくとも拡張モードでsed
それをサポートしているので、とにかく試してみる価値があります。\b