2009-07-02 25 views
32

Wie kann man einen Teil einer Linie durch sed ersetzen?sed: Teil einer Linie ersetzen

DBSERVERNAME  yyy 

Der Wert xxx zwei Laschen zwischen DBServerName und dem Wert werden, variieren, und es kann:

Die Linie

DBSERVERNAME  xxx 

sollte ersetzt werden. Dieses Name/Wert-Paar ist eines von vielen aus einer Konfigurationsdatei.

habe ich versucht, mit folgenden Rückreferenzierung:

echo "DBSERVERNAME xxx" | sed -rne 's/\(dbservername\)[[:blank:]]+\([[:alpha:]]+\)/\1 yyy/gip' 

und das führte zu einem Fehler: ungültige Referenz \ 1 auf RHS Befehl `s.

Was ist falsch mit dem Ausdruck? Mit GNU sed.

Antwort

39

Dies funktioniert:

sed -rne 's/(dbservername)\s+\w+/\1 yyy/gip' 

(Wenn Sie die Option -r verwenden, müssen Sie nicht die Pars entkommen.)

+2

Ich weiß, Sie haben eine Menge Erfahrung in Shell-Befehle ... aber bitte kümmern sich die aufstrebenden Linux-Noobs, wo immer möglich .... alles in '' ''muss erklärt werden .... oder ich muss gehe durch das ganze [doc] (https://www.gnu.org/software/sed/manual/sed.html) – Mahesha999

2

Sie entkommen Ihre (und). Ich bin mir ziemlich sicher, dass du das nicht tun musst. Versuchen Sie:

 
sed -rne 's/(dbservername)[[:blank:]]+\([[:alpha:]]+\)/\1 yyy/gip' 
1

Sie sollten Dinge nicht entkommen, wenn Sie einfache Anführungszeichen verwenden. dh.

echo "DBSERVERNAME xxx" | sed -rne 's/(dbservername[[:blank:]]+)([[:alpha:]]+)/\1 yyy/gip' 
1

Sie sollten Ihren Paren nicht entkommen. Versuchen:

echo "DBSERVERNAME xxx" | sed -rne 's/(dbservername)[[:blank:]]+([[:alpha:]]+)/\1 yyy/gip' 
7

Andere haben bereits erwähnt, das entweichende von Klammern, aber warum brauchen Sie überhaupt eine Referenz, wenn der erste Teil der Zeile konstant ist?

könnten Sie einfach tun

sed -e 's/dbservername.*$/dbservername yyy/g' 
+1

Guter Punkt! Ich hatte gerade erst gelernt, regexps + sed zu benutzen und dachte mir einfach 'regexp' aus, als 'jwz' sagte 'ich hatte zwei Probleme' (obwohl nicht direkt aufgrund der regulären Ausdrücke) :) – calvinkrishy

+0

Das bekommt meine Stimme weil es die einfachste Lösung für ein einfaches Problem ist. Wenn Sie eine Rückreferenz verwenden, können Sie die beiden Kopien von 'dbservername' nicht falsch darstellen. Es ist offensichtlich hier, aber wenn ich postgresql.conf in sed modifiziere, finde ich es schwierig, auf einen Blick zu sehen, ob ich 'listen_address' oder' listen_addresses' (postgresql.conf) getippt habe.Beide sehen plausibel aus, aber nur einer ist richtig. –

1

Dies könnte für Sie arbeiten:

echo "DBSERVERNAME  xxx" | sed 's/\S*$/yyy/' 
DBSERVERNAME  yyy 
0

Versuchen Sie, diese

sed -re 's/DBSERVERNAME[ \t]*([^\S]+)/\yyy/ig' temp.txt

oder dieses

awk '{if($1=="DBSERVERNAME") $2 ="YYY"} {print $0;}' temp.txt