Ich habe eine Datei mit folgendem Inhalt:
<username><![CDATA[name]]></username>
<password><![CDATA[password]]></password>
<dbname><![CDATA[name]]></dbname>
und ich muss ein Skript erstellen, das "name" in der ersten Zeile in "something", "password" in der zweiten Zeile in "somethingelse" und "name" in der dritten Zeile in "somethingdifferent" ändert. Ich kann mich nicht darauf verlassen, dass diese in der Datei in der richtigen Reihenfolge vorkommen. Daher kann ich das erste Vorkommen von "name" nicht einfach durch "something" und das zweite Vorkommen von "name" durch "somethingdifferent" ersetzen. Ich muss tatsächlich nach den umgebenden Zeichenfolgen suchen, um sicherzustellen, dass ich die richtige Sache finde und ersetze.
Bisher habe ich diesen Befehl ausprobiert, um das Vorkommen des ersten "Namens" zu finden und zu ersetzen:
sed -i "s/<username><![CDATA[name]]><\/username>/something/g" file.xml
Es funktioniert jedoch nicht, daher denke ich, dass einige dieser Zeichen möglicherweise entkommen müssen.
Im Idealfall würde ich gerne Regex verwenden, um nur die beiden Vorkommen "Benutzername" abzugleichen und nur den "Namen" zu ersetzen. So etwas aber mit sed
:
<username>.+?(name).+?</username>
und ersetzen Sie den Inhalt in den Klammern durch "etwas".
Ist das möglich?
quelle
Antworten:
Das ist, denke ich, wonach Sie suchen.
Erläuterung:
\1
,\2
usw. im zweiten Teil sind Verweise auf die im ersten Teil erfasste i-te Gruppe (die Nummerierung beginnt mit 1)-E
aktiviert erweiterte reguläre Ausdrücke (benötigt für+
und Gruppierung).quelle
(original name) + "-E"
.\(
und\)
anstelle von(
und verwenden)
.Der Befehl
/username/
vor dems
Befehl soll nur für Zeilen verwendet werden, die die Zeichenfolge 'Benutzername' enthalten.quelle
Wenn dies
sed
nicht unbedingt erforderlich ist, sollten Sie stattdessen ein spezielles Tool verwenden.Wenn Ihre Datei gültiges XML ist (nicht nur diese drei XML-Tags), können Sie XMLStarlet verwenden :
Das Obige funktioniert auch in Situationen, die mit regulären Ausdrücken schwer zu lösen sind:
Kurze Demonstration der oben genannten:
quelle
Sie müssen
\[.*^$/
im regulären Ausdrucksteil dess
Befehls und\&/
im Ersatzteil plus Zeilenumbrüche angeben. Der reguläre Ausdruck ist ein grundlegender regulärer Ausdruck . Außerdem müssen Sie den Begrenzer für dens
Befehl in Anführungszeichen setzen .Sie können ein anderes Trennzeichen auswählen, um Anführungszeichen zu vermeiden
/
. Sie müssen stattdessen dieses Zeichen in Anführungszeichen setzen. In der Regel müssen Sie jedoch ein Trennzeichen auswählen, das weder im zu ersetzenden Text noch im Ersatztext vorkommt.Sie können Gruppen verwenden, um zu vermeiden, dass einige Teile im Ersetzungstext wiederholt werden, und Variationen an diesen Teilen berücksichtigen.
quelle
Sie können einfach Adressen wie in der Zahl vor "s" verwenden, die die Zeilennummer angibt.
Auch die Zahl am Ende weist
sed
darauf hin, die zweite Übereinstimmung zu ersetzen, anstatt die erste Übereinstimmung zu ersetzen.quelle
Um das Wort "name" durch das Wort "something" zu ersetzen, verwenden Sie:
Das wird alle Vorkommen des angegebenen Wortes ersetzen.
Bisher wird alles auf Standardausgabe ausgegeben. Sie können Folgendes verwenden:
um die Änderungen in einer anderen Datei zu speichern.
quelle
So ersetzen Sie den Wert in einer Eigenschaftendatei
quelle