我想使用sed
来处理属性文件,例如:
java.home=/usr/bin/java
groovy-home=/usr/lib/groovy
workspace.home=/build/me/my-workspace
我想将.
和-
替换为_
,但只能取代=
的令牌。输出将是
java_home=/usr/bin/java
groovy_home=/usr/lib/groovy
workspace_home=/build/me/my-workspace
我尝试了各种方法,包括使用地址,但我一直都在失败。有人知道怎么做吗?
答案 0 :(得分:1)
awk 让生活更轻松:
awk -F= -vOFS="=" '{gsub(/[.-]/,"_",$1)}1' file
你去:
kent$ echo "java.home=/usr/bin/java
groovy-home=/usr/lib/groovy
workspace.home=/build/me/my-workspace"|awk -F= -vOFS="=" '{gsub(/[.-]/,"_",$1)}1'
java_home=/usr/bin/java
groovy_home=/usr/lib/groovy
workspace_home=/build/me/my-workspace
如果你真的想用sed( gnu sed )
sed -r 's/([^=]*)(.*)/echo -n \1 \|sed -r "s:[-.]:_:g"; echo -n \2/ge' file
同样的例子:
kent$ echo "java.home=/usr/bin/java
groovy-home=/usr/lib/groovy
workspace.home=/build/me/my-workspace"|sed -r 's/([^=]*)(.*)/echo -n \1 \|sed -r "s:[-.]:_:g"; echo -n \2/ge'
java_home=/usr/bin/java
groovy_home=/usr/lib/groovy
workspace_home=/build/me/my-workspace
答案 1 :(得分:1)
怎么样......
$ echo foo.bar=/bla/bla-bla | sed -e 's/\([^-.]*\)[-.]\([^-.]*=.*\)/\1_\2/'
foo_bar=/bla/bla-bla
但是,如果您在左侧有一个以上的点或短划线,则不适用。我将不得不进一步思考。
答案 2 :(得分:0)
在这种情况下,我会使用AWK
代替sed
:
awk -F"=" '{gsub("\\.|-","_",$1); print $1"="$2;}' <file.properties>
输出:
java_home/usr/bin/java
groovy_home/usr/lib/groovy
workspace_home/build/me/my-workspace
答案 3 :(得分:0)
答案 4 :(得分:0)
这适用于行中的任意数量的点和连字符,并且不需要GNU sed:
sed 'h; s/.*=//; x; s/=.*//; s/[.-]/_/g; G; s/\n/=/' < data
以下是:
=
之后吹走所有内容答案 5 :(得分:0)
使用sed的其他方式
sed -re 's/(.*)([.-])(.*)=(.*)/\1_\3=\4/g' temp.txt
输出
java_home=/usr/bin/java
groovy_home=/usr/lib/groovy
workspace_home=/build/me/my-workspace
如果左侧有.-
以上,那么
sed -re ':a; s/^([^.-]+)([\.-])(.*)=/\1_\3=/1;t a' temp.txt