2016-04-09 23 views
0

Ich muss 'bind a.b.c.d: 80' zu 'bind x.b.f.d: 80' ändern. Ich habe zu diesem Zweck unten Befehl geschrieben, aber es funktioniert nicht, ich weiß nicht warum?Sed Befehl und reguläre Ausdrücke

sed -i 's,bind *:35357,bind x.y.z.a:35357,' haproxy-sample.cfg 

Jede Hilfe wäre willkommen.

Vielen Dank im Voraus.

+0

Bitte beachten Sie, dass Ihr Beispiel '35357' als Portnummer verwendet und der Text von' 80' spricht. Fügen Sie einige Beispiel-Eingabezeilen zusammen mit den entsprechenden erforderlichen Ausgabezeilen hinzu. –

+0

Wann immer du jemanden um Hilfe bittest, um ein Programm zu debuggen und ihm zu sagen, dass es nicht funktioniert, ohne Informationen darüber, wie es nicht funktioniert (falsche Ausgabe, keine Ausgabe, Fehlermeldung, etwas anderes?) Ist immens frustrierend und a Zeitverschwendung für alle Beteiligten. Das Problem ist, dass Sie die Bedeutung von * als Regexp-Metazeichen mit einem Globbing-Zeichen verwechseln. –

+0

@ Lars Fischer, wenn Sie sich auf meine Frage konzentrieren,: 80 oder: 35357 spielt keine Rolle. Was zählt ist die Regex, um die Änderungen in der Datei zu aktualisieren. –

Antwort

1

von bash Ausgeführt

$ echo bind 12.54.36.165:35357 | sed "s/bind [^:]\+:35357/bind a.y.z.a:35357/" 
bind a.y.z.a:35357 
0

Ich denke, du so some brauchen:

sed -r 's/^(bind\s+)([^.]+)\.([^.]+)\.([^.]+)\.([^.:]+)(:80(\s+.*)?)$/\1x.\3.f.\5\6/g' haproxy-sample.cfg 

, wo Sie die wörtliche .f. und x. mit Ihren gewünschten Saiten ersetzen müssen (im zweiten Teil des sed s).

Es erfaßt die verschiedenen Teile (bind, die vier Ziffern der Adresse, die :80 bis in \1 zu \6 LineEnd und die aufgenommenen Saiten mit den b und f rekombinieren.

0

Das Problem wird Ihr Muster ein enthält lone * - Sie denken wahrscheinlich über Shell Globbing-Muster, wo * 0 oder mehr beliebige Zeichen entspricht. sed spricht keine Shell-Muster, es spricht reguläre Ausdrücke. Wo Sie nur * haben, benötigen Sie .* - in einem regulären Ausdruck der . c haracter ist ein Platzhalter, der mit einem beliebigen Zeichen übereinstimmt, und * ist ein Quantor, der null oder mehr der vorhergehenden Sache entspricht.

sed -i 's/\(bind \).*\(:35357\)/\1x.y.z.a\2/'