web-dev-qa-db-ja.com

単語全体の検索と置換

Sedを使用して単語全体を検索および置換するにはどうすればよいですか?

やること

_sed -i 's/[oldtext]/[newtext]/g' <file> 
_

また、_[oldtext]_の部分一致も置き換えますが、これは望ましくありません。

107
ksuralta

正規表現の\ bは、Wordの境界(つまり、最初のWord文字と非Word文字の間の位置)に一致します。

$ echo "bar embarassment" | sed "s/\bbar\b/no bar/g"
no bar embarassment
151
Joakim Lundborg

Mac OS Xでは、これらの正規表現構文のnotherは、単語全体を一致させるためにsed内で機能します

  • \bmyWord\b
  • \<myWord\>

thisい構文を使用する必要があります。

  • /[[:<:]]myWord[[:>:]]/

したがって、たとえば、単語全体に対してのみmintmintyに置き換えるには:

  • sed "s/[[:<:]]mint[[:>:]]/minty/g"

ソース: re_format man page

127
Larry Gerndt

つかいます \bワード境界の場合:

sed -i 's/\boldtext\b/newtext/g' <file>
12
Mitch Wheat

私のマシンの1つで、「\b "(引用符なし)は機能しませんでした。解決策は" \<」は区切り文字の開始に、「\> "で区切り文字を終了します。

Joakim Lundberg の例で説明するには:

$ echo "bar embarassment" | sed "s/\<bar\>/no bar/g"
no bar embarassment
7
Arun

シェルコマンド:

echo "bar embarassment" | sed "s/\bbar\b/no bar/g" 

または:

echo "bar embarassment" | sed "s/\<bar\>/no bar/g"

ただし、vimを使用している場合は、後者のみを使用できます。

:% s/\<old\>/new/g
2
arganzheng