• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

Ersetzen einer bestimmten Stelle in einem File

byron1778

Hacker
Hallo Forum!

Ich habe folgendes Problem:

Ich will in einer Datei eine bestimmte Stelle mit einem anderen String ersetzen:

Das File hat folgenden Aufbau:

Code:
requestType: { 98 }; /* riskDetail */
hsRequest: { 100.000000, 1.000000, 100.000000, 1, 3, 0, 10, 2, 1, 3, 0, 1, Y, N, N, N, Y, "EUR", "ABCDEFGKL" };
tsInfo: { 1000, 0, 0 };
locationSpecifier: { 16, abababa, -1005, 1, 1, "RD_0304_SH" };
dimensionNameString: {  "PCGROUP"  };
longNumber: { 25000117  };
aggregationTerms: { "PCGROUP", NETCURRENCY_FILTER_STRING, "third" };
longNumber: { -1010  };
jobAttribute: {  STORE_RESULT_ATTRIBUTE  };

Ich möchte gerne bei
Code:
locationSpecifier: { 16, -1003, -1005, 1, 1, "RD_0304_SH" };

die Zahl -1003 durch 1234 ersetzen und dann das Ergebnis samt den anderen Zeilen wieder in ein anderes File schreiben!

Leider weiss ich aber nicht, wie ich das hinbekommen kann, ohne dass ich viel mit Perl oder dergleichen herumhantieren muss!
Habe mir gedacht, dass ich es mit sed vll hinbringen kann?

Danke Euch vielmals für jede Hilfe bereits!
 
A

Anonymous

Gast
byron1778 schrieb:
Ich will in einer Datei eine bestimmte Stelle mit einem anderen String ersetzen:
eine Datei nur eine einzige Stelle ändern :schockiert: , geht immer am besten mit dem Editor. ;)


byron1778 schrieb:
Habe mir gedacht, dass ich es mit sed vll hinbringen kann?
das geht natürlich auch. zB.
Code:
sed '/Suchmuster für die Zeile/s/Suchstring/Ersatzstring/' datei  > datei.neu

Aufpassen hier mit einigen Sonderzeichen, die müssten im Suchmuster bei sed entwertet werden.
also in etwa
Code:
sed '/^locationSpecifier/s/-1003/1234/' datei > datei.neu
Wenn der genaue Suchstring nicht bekannt ist, dann muss er mit Hilfe von Regulären Ausdrücken so gut wie möglich eindeutig beschrieben werden.

Den Einstieg zum Verständis von sed gibts hier


robi
 
OP
B

byron1778

Hacker
Hallo!

Danke Dir vielmals für deine Hilfe!

Bei einem Probem komme ich aber nicht weiter, nämlich den Regular Expressions:
Bei all den Anleitungen konnte ich nur folgendes bis jetzt finden. Nämlich diese Form:

Code:
sed 's/'SUCHE'/'ERSETZE'/

Wenn ich Deinen Code hernehme und es versuche umzumodeln

Code:
sed '/^locationSpecifier: { /s/[0-9]*/1234/' datei > datei.neu

hängt er die Zahl 1234 stets am Anfang der Zeile an:

Code:
requestType: { 98 }; /* riskDetail */
hsRequest: { 100.000000, 1.000000, 100.000000, 1, 3, 0, 10, 2, 1, 3, 0, 1, Y, N, N, N, Y, "EUR", "ABCDEFGKL" };
tsInfo: { 1000, 0, 0 };
1234locationSpecifier: { 16, -1003, -1005, 1, 1, "RD_0304_SH" };
dimensionNameString: {  "PCGROUP"  };
longNumber: { 25000117  };
aggregationTerms: { "PCGROUP", NETCURRENCY_FILTER_STRING, "third" };
longNumber: { -1010  };
jobAttribute: {  STORE_RESULT_ATTRIBUTE  };

Ich weiss zwar, dass ^ am Anfang bedeutet, aber in diesem Fall, müsste es ja heissen, dass er am Anfang den String locationSpecifier sucht, warum setzt er hier aber 1234 an den Anfang?

Eigentlich möchte ich ja nur, dass er [0-9] auf die Zahl 16 anwendet?!

Danke für Deine Hilfe!
 
A

Anonymous

Gast
byron1778 schrieb:
Hallo!

Wenn ich Deinen Code hernehme und es versuche umzumodeln

Code:
sed '/^locationSpecifier: { /s/[0-9]*/1234/' datei > datei.neu

hängt er die Zahl 1234 stets am Anfang der Zeile an:

1234locationSpecifier: { 16, -1003, -1005, 1, 1, "RD_0304_SH" };

das ist richtig so, denn dein regulärer Ausdruck ist falsch oder nicht richtig.

"[0-9]*" bedeutet eine Ziffer kann beliebig oft vorkommen, muss aber nicht. Damit findet er am Anfang ein anderes Zeichen, und sagt sich der Reguläre Ausdruck passt schon vorher da ja keine Ziffer vor dem ersten Buchstaben ist und ersetzt das erste nicht existente Zeichen ;) ;)

In deinem Fall musst du hier genauer werden
Code:
sed 's/[-]*[0-9]\{4\}/1234/ '

[-]* ---> Das Minuszeichen darf beliebig oft vorkommen auch fehlen
[0-9]\{4\} ---> anschließend müssen 4 Ziffern stehen

Es soll dabei die erste Ersetzung in der Zeile vorgenommen werden



Das ist aber nur eine von vielen Möglichkeiten, je nach Schwierigkeitsgrad kann man das mit verschiedenen Erweiterungen der Regulären Ausdrücke vereinfachen und verkomplizieren bis außer dem Rechner selber niemand mehr durchblickt. ;)
Eine andere Methode währe zB. über die Position zu gehen, zB so hier.
Code:
sed 's/^\(.*,.*,\).*\(,.*\)$/\1 1234 \2/ '
's/^\(.*,.*,\).*\(,.*\)$/\1 1234 \2/ '
wir suchen auf der ganzen Zeile von Anfang (^) bis Ende ($)
Erster Suchbereich geht von Anfang bis zum 2. Komma und wird bei der Ersetzung mit (\1) unverändert wieder eingesetzt
zweiter Suchbereich schließt sich an und wird ersetzt
der dritte Suchbereich folgt anschließend mit einem Komma -bis Ende und wird wieder (\2)unverändert eingesetzt.


robi
 
Oben