使用sed替换多个条件的字符

时间:2016-05-10 12:23:01

标签: regex bash sed

我需要在等于标记之前替换所有点字符,但我无法弄清楚如何使用它,因为涉及2个条件。

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

应该是

lib_libraries=cache,common,myjar.jar,blablablam

在正确的正则表达式http://regexr.com/上玩了很长时间并没有帮助。这看起来很简单,但我对正则表达式来说还是一个新手,而我却无法解决这个问题。

编辑:忘记提及 - 我还需要处理多个点分隔符,即lib.libraries.library.etc=cache,common,myjar.jar,blablabla

5 个答案:

答案 0 :(得分:0)

这应该有效:

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

答案 1 :(得分: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

它将字符循环至=,并将所有.替换为_

答案 2 :(得分:0)

这是一个简单的awk 1-liner:

$ 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

答案 3 :(得分:0)

这取代了行的开头和第一个等号之间的最后一个(因为“贪婪”匹配)点:

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

答案 4 :(得分:0)

正则表达式:(^(?:(?!=|\.).)*)\.((?:(?!=).)*(?=\=))
替换:$1_$2
试试这个会起作用