2016-05-10 16 views
1

Ich muss alle Punkte Zeichen vor Gleichheitszeichen ersetzen, aber ich konnte nicht herausfinden, wie es geht, da es 2 Bedingungen beteiligt sind.Verwenden Sie sed, um Zeichen durch mehrere Bedingungen zu ersetzen

lib.libraries=cache,common,myjar.jar,blablabla 

sollte

sein
lib_libraries=cache,common,myjar.jar,blablablam 

Spielen um für eine lange Zeit auf http://regexr.com/ für die richtige regex nicht helfen. Es scheint einfach, aber ich bin ziemlich neu in Regex und ich kann es einfach nicht knacken.

Edit: vergessen zu erwähnen - ich muss auch mit mehreren Punkt seperators beschäftigen, dh lib.libraries.library.etc=cache,common,myjar.jar,blablabla

Antwort

0

Try this:

$ sed ":a;s/\.\([^=]*=\)/_\1/;ta" <<< "lib.libraries=cache,common,myjar.jar,blablabla" 
lib_libraries=cache,common,myjar.jar,blablabla 

$ sed ":a;s/\.\([^=]*=\)/_\1/;ta" <<< "other.lib.libraries=cache,common,myjar.jar,blablabla" 
other_lib_libraries=cache,common,myjar.jar,blablabla 

Es Schleifen über Zeichen bis = und ersetzen Sie alle . durch _.

+0

'myjar_jar'? das ist nicht, was OP will ... – Jahid

+0

@Jahid Du hast Recht. – SLePort

+0

@Jahid Aktualisiert meine Antwort. – SLePort

0

Diese Arbeit sollte:

sed 's/^\(.*\)\.\(.*=.*\)$/\1_\2/g' file 
+0

Es funktioniert nicht. – SLePort

+0

@Kenavoz: Ich habe es bearbeitet. Habe die g-Flagge vergessen, es sollte jetzt funktionieren. – Jahid

0

Hier ist ein einfacher awk 1-liner:

$ awk -F = '{gsub(/\./, "_", $1); print $1 "=" $2}' <<< "lib.libraries=cache,common,myjar.jar,blablabla" 
lib_libraries=cache,common,myjar.jar,blablabla 

funktioniert auch für mehrere Punkte:

$ awk -F = '{gsub(/\./, "_", $1); print $1 "=" $2}' <<< "lib.libraries.pkg=cache,common,myjar.jar,blablabla" 
lib_libraries_pkg=cache,common,myjar.jar,blablabla 
0

Dies ersetzt die letzte (wegen "gierig" matching) Punkt zwischen Anfang die Linie und das erste Gleichheitszeichen:

sed 's/^\([^=]*\)\./\1_/' 
0

Regex: (^(?:(?!=|\.).)*)\.((?:(?!=).)*(?=\=))
ersetzen: $1_$2
die Sie interessieren werden vor dem `=` für mehrere Punkte

Verwandte Themen