2013-02-28 84 views
2

我有以下内容的文件(这是从Java .properties文件):在属性名替换点,但没有在属性值

product.company.url=http://www.example.com/ 
product.version=1.3.2 

我需要替换所有点的属性名,但不属于财产价值。所以,我需要的输出将是:

product_company_url=http://www.example.com/ 
product_version=1.3.2 

我已经试过sed -r 's/\.(\w+)([^=]*)/_\1\2/' product.default.properties但这只是取代了第一点。我想我可能不得不使用lookahead或lookbehinds,但我不知道这是否可能,因为断言的长度是可变的。在属性名称中也可能有可变数量的点。

是否可以用单线程来做到这一点?

回答

2

尝试这一行:

awk -F= -vOFS="=" 'gsub(/\./,"_",$1)+1' file.properties 

测试你的榜样:

kent$ echo "product.company.url=http://www.example.com/ 
product.version=1.3.2"|awk -F= -vOFS="=" 'gsub(/\./,"_",$1)+1' 
product_company_url=http://www.example.com/ 
product_version=1.3.2 
+0

这是完美的!非常感谢(我还不能接受答案,将在10分钟内完成) – jvallver 2013-02-28 16:53:19

+0

@jvallver我的答案可能会解决您的问题。但是我会说,java属性文件中prop name的命名约定是用“dot”,而不是下划线。 – Kent 2013-02-28 16:57:13

+0

我知道,但我在使用EnvInject插件解释属性中带有点的属性时遇到了问题。我试图将这作为一个具体构建中的解决方法,但通常我使用点分隔的属性:) – jvallver 2013-02-28 16:59:19