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

Datei nach String durchsuchen und ersetzen?

sphings

Member
Hallo,

ich hab da ein kleines Problem,
ich muss eine Datei nach einem String durchsuchen, und diesen dann ersetzen.
Der string nachdem ich suchen muss ist ";" ersetztwerden muss er durch ":" ohne die Anführungszeichen.

Hat da jemand einen Ansatz für mich?

Danke

sphings
 
Aber Perl kann viel mehr!
Code:
perl -i -pe 's/(.)\1{9}/chr(ord($1)+1) x length($&)/eg'
ersetzt jede 10er-Buchstabenreihe durch den nächsten (im ASCII-Zeichensatz)
 
OP
S

sphings

Member
jengelh schrieb:
Aber Perl kann viel mehr!
Code:
perl -i -pe 's/(.)\1{9}/chr(ord($1)+1) x length($&)/eg'
ersetzt jede 10er-Buchstabenreihe durch den nächsten (im ASCII-Zeichensatz)

Supi :)
Perl gefällt mir ... muss ich mich dringend mal einlesen :)
Was ich jetzt schon weiß ist:
Code:
perl -pi -e 's/;/:/i' *.csv

Aber da gibt es jetzt noch einen kleinen Haken, ich muss nur die ; in : umwandeln, die vor dem ; kein " haben also die nicht so: "; aussehen.
Hat da vllt jemand noch ne idee?

Ich mein umständlich würds gehen mit "; in %' umzuwandeln, dann alle ; ersetzen und dann %' wieder in "; aber das geht bestimmt einfacher oder?

gruß

sphings

___________________________________
EDIT

Ach ja vergessen, und wie mach ich das, das er das nicht nur 1x pro Zeile ersetzt, sondern so oft wie es vorkommt (also z.b. 10x prozeile)?
OK zumindest diese Frage hat sich erledigt, das geht mit /g anstatt /i am ende ;)
 
Hmm, das könnte gehen:
Code:
sed -i -e 's/\([^"]\);/\1:/g'  datei[en]
\([^"\) sollte für alle ; ohne " davor stehen. durch \( \) kann das beim Ersetzen als \1, \2 2te \( \) referenzieren, also in diesem Fall das Zeichen erhalten und ein : dahinter hängen.

Ciao,

Haveaniceday

PS: Nur neuere sed können -i für direkt in der Datei ändern.
 

regexer

Advanced Hacker
haveaniceday schrieb:
Hmm, das könnte gehen:
Code:
sed -i -e 's/\([^"]\);/\1:/g'  datei[en]
Wobei man berücksichtigen muss, dass ; auch am Zeilenanfang stehen kann. Für diesen Fall muss man noch ergänzen:
Code:
sed 's/\([^"]\);/\1:/g;s/^;/:/'
In Perl geht es natürlich auch ...
Code:
perl -pe 's/(^|[^"]);/$1:/g' datei
 
OP
S

sphings

Member
notoxp schrieb:
haveaniceday schrieb:
Hmm, das könnte gehen:
Code:
sed -i -e 's/\([^"]\);/\1:/g'  datei[en]
Wobei man berücksichtigen muss, dass ; auch am Zeilenanfang stehen kann. Für diesen Fall muss man noch ergänzen:
Code:
sed 's/\([^"]\);/\1:/g;s/^;/:/'
In Perl geht es natürlich auch ...
Code:
perl -pe 's/(^|[^"]);/$1:/g' datei

Danke :)

Aber da ich ncoh 3 andere sachen hätte ändern müssen, hab ihc nich dazu entschlossen das trennzeichen auf | zu ändern ;)
macht vieles einfacher :)

gruß

sphings
 

regexer

Advanced Hacker
sphings schrieb:
Aber da ich ncoh 3 andere sachen hätte ändern müssen, hab ihc nich dazu entschlossen das trennzeichen auf | zu ändern ;)
macht vieles einfacher :)
Kleiner Tipp aus der Praxis: Wenn es um Datenexporte aus Datenbanken geht, verwende ich als Trennzeichen meist den Tabulator. Da die meisten Eingabeformulare Tab zum "weiterspringen" verwenden und damit als Eingabe nicht akzeptieren, kommt es in den seltesten Fällen innerhalb der Datenfelder vor ...
 
Code:
s/(?<!");/:/
"Semikolon, davor (<) nicht (!) Anführungszeichen" [look-behind] ;-) Jo, mit [^"] geht's natürlich auch - ist aber auch look-forward.
 

regexer

Advanced Hacker
jengelh schrieb:
Code:
s/(?<!");/:/
"Semikolon, davor (<) nicht (!) Anführungszeichen" [look-behind] ;-) Jo, mit [^"] geht's natürlich auch - ist aber auch look-forward.
Man muss dazusagen: Das geht nur in perl, und selbst dort war es in früheren Versionen nicht möglich ...
 
Oben