2016-10-10 13 views
0

Ich weiß, ich kann dies mit SED tun. Aber in meiner spezifischen Aufgabe ist es etwas komplex. So konnte ich es trotz der vielen Beispiele auf dieser Seite nicht herausfinden.Suchen und Ersetzen Zeichenfolge im Bash-Skript mit SED

Ich habe eine Konfigurationsdatei mit Anmeldeinformationen.

<username><![CDATA[prefix_cms]]></username> 
<password><![CDATA[complexpwd]]></password> 
<dbname><![CDATA[prefix_cms]]></dbname> 

Ich möchte alle Anmeldeinformationen in einen neuen eindeutigen Wert ändern. Dies ist ein Problem, wenn ich eine Ersetzung mit SED finde, weil es den Benutzernamen UND den Datenbanknamen auf seinen neuen Wert ändert.

Die neuen Werte sollten zum Beispiel sein:

newusername 
newpassword 
newdbname 

Wie würde ich das tun? Ich habe nach dem ersten Vorfall in SED gesucht, konnte es aber aus irgendeinem Grund nicht funktionieren lassen.

Ich habe auch versucht, die gesamte Zeile einschließlich der XML und CDATA protions zu finden und zu ersetzen, aber das macht es komplexer wegen der speziellen Zeichen.

Wie kann ich das lösen?

EDIT:

Der Ausgang Ich suche.

<username><![CDATA[newusername]]></username> 
<password><![CDATA[newpassword]]></password> 
<dbname><![CDATA[newdbname]]></dbname> 

Auf der Suche nach der ersten Antwort, die ich sehe, war ich nicht sehr klar über das, was ich wollte.

EDIT2:

ich eine perfekte Lösung hier gefunden: Sed regex change of file

+0

Warum -1? Feedback? – Akif

+0

können Sie die gesamte erwartete Ausgabe aus Gründen der Übersichtlichkeit posten? es gibt keine Überschneidung, um irgendeine Art von Problem vorzuschlagen, also fügen Sie auch Ihren Versuch hinzu, damit Sie erfahren können, wo Sie schief gelaufen sind ... und auch ich habe nicht abgelehnt ... – Sundeep

+1

Ich habe nicht abgestimmt, aber ich frage mich, wo ist die erwartete Leistung oder die Mühe, die Sie hineingesteckt haben? –

Antwort

1

Do:

sed -E 's/username|password|dbname/new&/g' file 
  • username|password|dbname Matches jeder username, password, dbname

  • im Ersatz wird new vor jedem Spiel perpended (&) und auf alle Vorkommen einer Übereinstimmung in einer Zeile (g)

Beispiel getan wird:

% cat file.txt 
<username><![CDATA[prefix_cms]]></username> 
<password><![CDATA[complexpwd]]></password> 
<dbname><![CDATA[prefix_cms]]></dbname> 

% sed -E 's/username|password|dbname/new&/g' file.txt 
<newusername><![CDATA[prefix_cms]]></newusername> 
<newpassword><![CDATA[complexpwd]]></newpassword> 
<newdbname><![CDATA[prefix_cms]]></newdbname> 

Antwort auf die editierte Frage:

Beispiel:

% cat file.txt 
<username><![CDATA[prefix_cms]]></username> 
<password><![CDATA[complexpwd]]></password> 
<dbname><![CDATA[prefix_cms]]></dbname> 

% sed -E 's/^(<([^>]+).*\[)[^]]+(.*)/\1new\2\3/' file.txt 
<username><![CDATA[newusername]]></username> 
<password><![CDATA[newpassword]]></password> 
<dbname><![CDATA[newdbname]]></dbname> 
+0

Danke, ich sehe, dass mir nicht ganz klar war, was ich wollte, ich habe die Frage mit der erwarteten Ausgabe bearbeitet. – Akif

+0

@Akif meine Änderungen überprüfen. – heemayl

Verwandte Themen