2010-12-15 2 views
15

Ich versuche zu finden und ersetzen ein oder mehrere Vorkommen eines Charakters mit sed auf einem Mac, sed von den BSD General Commands.Wie zu entkommen Plus-Zeichen auf Mac OS X (BSD) sed?

Ich versuche:

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

zu sehen erwarten:

fbar 

Aber anstatt Ich sehe

foobar 

Ich kann natürlich nur das Plus erweitern manuell mit:

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

aber was muss ich tun, damit das Pluszeichen funktioniert?

+0

mit '/ g' Flag,' s/o // g' ist genug, um alle 'o' Vorkommen zu ersetzen. – khachik

Antwort

27

Mit dem /g Flag ist s/o//g genug, um alle o Vorkommen zu ersetzen.

Warum + nicht wie erwartet funktioniert: in alten, obsolet re + ist ein gewöhnlicher Charakter (wie auch |, ?). Sie sollten -E Flag sed angeben, um es modernen regulären Ausdrücken zu machen:

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

Quelle: man 7 re_format.

+0

+1, mit dem '-E'-Flag funktioniert es wie beschrieben. Aus irgendeinem Grund konnte ich das jedoch nicht auf den man/info-Seiten finden. Offiziell scheint es, dass die Optionen "-r" und "--regexp-extended" der richtige Weg sind. – Chriki

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

arbeitete für mich auf Mac OS X 10.6.

Ich erinnerte mich, dass ich meine BSD-Version von sed mit GNU sed 4.2 ersetzt, so dass dies für Sie funktionieren kann oder nicht.

+0

Funktioniert nicht am 10.5 ... – khachik

+0

In Terminal.app müssen Sie möglicherweise einen doppelten Backslash verwenden. – eyelidlessness

+0

@eyelidlessness Funktioniert auch nicht. Siehe meine Antwort für weitere Informationen. – khachik

0

Sed ist traurig für Regexes. Sie könnten entweder versuchen, das -E, die mit BSD funktionieren könnte, oder Sie könnten versuchen diese stattdessen:

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

Vielleicht gibt es zu viele sed ist da draußen auf jedem System ein brauchbares Werkzeug zu haben.

0

Sie können dies unter Linux oder Unix verwenden.

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

Dies liefert keine Antwort auf die Frage. Um einen Autor zu kritisieren oder um Klärung zu bitten, hinterlasse einen Kommentar unter seinem Beitrag - du kannst deine eigenen Beiträge jederzeit kommentieren, und sobald du genügend [Reputation] (http://stackoverflow.com/help/whats-reputation) hast, wirst du das tun in der Lage sein [jeden Beitrag kommentieren] (http://stackoverflow.com/help/privileges/comment). –

+0

Verwenden Sie dies, um das Problem zu lösen, und brauchen Sie sich nicht um das Escape-Problem kümmern. –