2010-12-15 8 views
15

私は、BSDの一般コマンドからsedを使って、mac上でsedを使って文字の1つ以上の出現箇所を見つけて置き換えようとしています。mac os x(BSD)sedでプラス記号をエスケープする方法は?

私は試してみてください。

echo "foobar" | sed -e "s/o+//g 

を見ることを期待:

fbar 

しかし、その代わりに、私は

foobar 

を参照してください、私はもちろん、ただで手動でプラスを拡張することができます

echo "foobar" | sed -e "s/oo*//g" 

でも、プラス記号を使用するにはどうすればよいですか?

+0

'/ g'フラグを使用すると、' s/o // g'はすべての 'o'オカレンスを置換するのに十分です。 – khachik

答えて

27

/gフラグを使用して、s/o//gはすべてのオカレンスを置き換えるのに十分です。期待通り+が動作しないのはなぜ

歳で、時代遅れ+再通常の文字(など|?)です。あなたはそれが近代的な正規表現を使用して作成するsed-Eフラグを指定する必要があります

echo "foobar" | sed -E -e "s/o+//" 
# fbar 

出典:man 7 re_formatを。

+0

+1であり、 '-E'フラグは説明したように動作します。何らかの理由で私はman/infoページでそれを見つけることができませんでした。正式には、 '-r'オプションと' --regexp-extended'オプションがあると思われます。 – Chriki

2
echo "foobar" | sed -e "s/o\\+//g" 

Mac OS X 10.6で私のために働いた。

私はBSD版のsedをGNU sed 4.2に置き換えたことを思い出しました。これはあなたのために働くかもしれません。

+0

10.5で動作しません... – khachik

+0

Terminal.appでは、ダブルバックスラッシュを使用する必要があります。 – eyelidlessness

+0

@eyelidlessnessどちらも動作しません。詳細は私の答えを見てください。 – khachik

0

Sedはregexesのために悲しいです。あなたはBSDで動作するかもしれません-Eを、試みることができるか、あなたの代わりにこれを試みることができる:

sed -e "s/o\{1,\}/" 

はおそらく、任意のシステムで使用可能なツールを持ってそこにあまりにも多くのSEDのがあります。

0

これはlinuxまたはunix上で使用できます。

echo "foobar" | perl -pe "s/o+//g" 
+0

これは質問に対する答えを提供しません。批評をしたり、著者の説明を求めるには、自分の投稿の下にコメントを残してください。自分の投稿にいつもコメントをつけることができます。そして、十分な[評判](http://stackoverflow.com/help/whats-reputation) [任意の投稿にコメントする]ことができます(http://stackoverflow.com/help/privileges/comment)。 –

+0

これを使用して問題を解決し、エスケープの問題に注意する必要はありません。 –

関連する問題