2012-04-09 35 views
3

nehme ich eine Textdatei mit vielen Zeilen haben, einer von ihnen dies zu sein:sed regex ersetzen mit Zitaten

<property name="HTTP_PORT" value="8080"></property> 

Und ich will es, dies ändern mit sed:

<property name="HTTP_PORT" value="80"></property> 

Wie Würde ich das tun? Ich habe versucht, eine Reihe von Dingen einschließlich der folgenden:

sed 's/^\(.+\)value=\"8080\"\(.+\)$/\1value=\"80\"\2/g' config.xml 
sed 's/^\(.+\)value="8080"\(.+\)$/\1value="80"\2/g' config.xml 
sed 's/^\(.+\)8080(.+\)$/\180\2/g' config.xml 
sed 's/^\(.+\)\"8080\"\(.+\)$/\1\"80\"\2/g' config.xml 
sed 's/^\(.+\)"8080"\(.+\)$/\1"80"\2/g' config.xml 

aber alles vergebens. Der Eingang und der Ausgang sind immer gleich.

+0

Vielen Dank für Ihre Antworten. Ich werde sie versuchen und die geeignetste akzeptieren, sobald ich eine Chance habe. –

Antwort

1

Per Korrekturen von @ Kevin (Danke!)

echo $'<property name="HTTP_PORT" value="8080"></property>'\ 
| sed 's/^\(.\+\)value=\"8080\"\(.\+\)$/\1value=\"80\"\2/g' 

Die richtige Lösung ist, die zu entkommen. '+' Auf das Pluszeichen auf '1 oder mehr' zu erreichen.

Edited ursprüngliche Antwort (das das Problem eine alternative Lösung zeigt) * so den Kontext gegeben Sie verwenden, was mit den traditionellen falsch ist .* (null oder mehr) *

echo $'<property name="HTTP_PORT" value="8080"></property>'\ 
| sed 's/^\(.*\)value=\"8080\"\(.*\)$/\1value=\"80\"\2/g' 

** Ausgabe **

<property name="HTTP_PORT" value="80"></property> 

Auch +1 für die Verankerung Ihrer Suchziele mit '^' und '$'. Ich habe Fälle gesehen (ähnlich denen, die Sie gerade machen), bei denen NICHT die Anker zu haben, die Laufzeit erheblich verlängert.

Ich hoffe, das hilft.

+1

Für die Aufzeichnung benötigt sed '\ +' für "eins oder mehrere". – Kevin

+0

Ich schätze die gemeinsame Anstrengung. Im Grunde ist nur der erste Codeausschnitt in dieser Antwort die Antwort, was mein erster Versuch ist, aber @ Kevins Kommentar über sed zu integrieren, der '\ +' für "einen oder mehrere" benötigt. Danke euch beiden. –

0
$> cat text 
<property name="HTTP_PORT" value="8080"></property> 

$> sed --regexp-extended 's/(value=\")[0-9]*/\180/' text 
<property name="HTTP_PORT" value="80"></property> 
2

Wie über die direkte Übersetzung von dem, was Sie wollen:

sed 's|<property name="HTTP_PORT" value="8080"></property>|<property name="HTTP_PORT" value="80"></property>|g' 

Es ist nicht so „klug“ eine Lösung, wie Sie oder ich finden konnte, aber es ist so einfach, wie sie kommen und wie Sie suchen eine statische Zeichenfolge, es ist alles was Sie brauchen.

+0

Ich bin kein großer Fan dieser Antwort. Die XML könnte korrekt sein, aber zusätzliche Leerzeichen enthalten. Es ist keine Frage einer weniger cleveren Lösung aufgrund des Mangels an Regex. Es ist einfach nicht so robust. (Zugegeben, die Regex-Lösung ist auch nicht narrensicher, aber robuster als das.) Aber danke. –

0

Dies könnte für Sie arbeiten:

sed -i '\|<property name="HTTP_PORT" value="8080"></property>|s/80//' config.xml 

oder vielleicht:

sed -i 's/"8080"/"80"/' config.xml