sed全単語検索と置換


120

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

している

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

また、[oldtext]私がやりたくない部分一致も置き換えます。

回答:


164

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

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


@OlegMazko私はまた、vimで使用するposixの受け入れ可能な方法を探しに来ました、そして私のために働いたのはs / \ <7 // gでした。コードの単語の先頭にある7を削除しようとしていました。このリンクは、具体的には、JPのソリューションは、答えに私を導いた:stackoverflow.com/questions/3864467/...(値下げが何らかの理由であなたのようにそれを埋め込むために得ることができませんでした)。
jimh 2017年

「そして」という単語を置き換えようとして怒っていたありがとう\band\b、その日を救った:)
MitchellK

144

Mac OS Xでは、これらの正規表現構文はいずれもsed内では単語全体を照合するために機能しません。

  • \bmyWord\b
  • \<myWord\>

今私を聞いて、後で私を信じて、この醜い構文はあなたが使う必要があるものです:

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

したがって、たとえば、単語全体に対してのみmintmintyに置き換えるには、次のようにします。

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

ソース:re_format manページ


19
sedMacPortsまたはHomebrew経由でGNU (および他のすべてのGNUツール)をインストールし、それが最初に来ることを確認してくださいPATH。Macをかなり使いやすくすることは可能です。
ジムスチュワート

9
@JimStewartは、「OS Xの場合はOS Xersとして実行する」ことを前提とする一連のツールを壊す優れた方法です。そうは言っても、私は間違いなくを提案できbrew install coreutilsます。
ELLIOTTCABLE 2015年

16
brew install gnu-sed使用するgsed
k107

brew coreutilsは素晴らしいです。一連のgnuバージョンのコマンド全体をインストールする他のbrewパッケージはありますか、それとも残りを個別にインストールする必要がありますか?
2015年

2
常にperlを使用する方が良い解決策ですperl -pe 's|\bone\b|two|g'。sedがときどき失敗する間、安定して動作します。
Pavel Vlasov

13

\b単語の境界に使用:

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

3
[]o,l->に注意してください[newtext],[newtext]。あなたは明らかに意味しました sed -i 's/\boldtext\b/newtext/g'
JJoao 2014年

7

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

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

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

2

シェルコマンドで:

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

または:

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

しかし、vimの場合は、後者しか使用できません。

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

-1
$ echo "bar embarassment"|awk '{for(o=1;o<=NF;o++)if($o=="bar")$o="no bar"}1'
no bar embarassment

OPは明示的に「sedを使用する」と述べています
ndemou 2014

これは分割操作結合であり、純粋な置換ではありません。これにより、複数のスペースが1つに折りたたまれ、先頭と末尾のスペースが破棄されecho " bar embarassment " | awk '{for(o=1;o<=NF;o++)if($o=="bar")$o="no bar"}1' | cat -Eますno bar embarassment$
musiphil 2016
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.