我需要在等于标记之前替换所有点字符,但我无法弄清楚如何使用它,因为涉及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
答案 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
试试这个会起作用