2016-05-10 2 views
1

Мне нужно заменить все символы точек до знака равенства, но я не мог понять, как идти на него, так как есть два условия.Использовать sed для замены символа несколькими условиями

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

должен быть

lib_libraries=cache,common,myjar.jar,blablablam 

Игра вокруг в течение долгого времени на http://regexr.com/ для правого регулярного выражения не помогло. Это кажется простым, но я довольно новичок в регулярных выражениях, и я просто не могу хрустнуть этот.

Edit: Забыл упомянуть - я также должен иметь дело с несколькими сепаратора обеспечивают точечно, т.е. lib.libraries.library.etc=cache,common,myjar.jar,blablabla

ответ

0

Попробуйте это:

$ 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 

Он перебирает символов до = и заменить все . на _.

+0

'myjar_jar'? это не то, что хочет OP ... – Jahid

+0

@Jahid Вы правы. – SLePort

+0

@Jahid Обновлен мой ответ. – SLePort

0

Это должно работать:

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

Это не работает для нескольких точек перед '='. – SLePort

+0

@ Kenavoz: Я его отредактировал. Забыл флаг g, он должен теперь работать. – Jahid

0

Вот простой awk 1-вкладыш:

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

Также работает для нескольких точек:

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

Это заменяет последний (из-за "жадной" Matching) усеивают между началом строка и первый знак:

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

Regex: (^(?:(?!=|\.).)*)\.((?:(?!=).)*(?=\=))
Заменить: $1_$2
Попробуйте это будет работать

Смежные вопросы