Bash 替换特性名称中的点,但不替换特性值中的点

Bash 替换特性名称中的点,但不替换特性值中的点,bash,shell,sed,awk,properties-file,Bash,Shell,Sed,Awk,Properties File,我有一个包含以下内容的文件(它是来自java的.properties文件): 我需要替换属性名称中的所有点,但不替换属性值中的点。因此,我期望的输出是: product_company_url=http://www.example.com/ product_version=1.3.2 我尝试了sed-r的/\(\w+)/\u1\2/'product.default.properties,但这只替换了第一个点。我想我可能必须使用lookaheads或lookbehinds,但我不知道是否可能,因

我有一个包含以下内容的文件(它是来自java的
.properties
文件):

我需要替换属性名称中的所有点,但不替换属性值中的点。因此,我期望的输出是:

product_company_url=http://www.example.com/
product_version=1.3.2
我尝试了
sed-r的/\(\w+)/\u1\2/'product.default.properties
,但这只替换了第一个点。我想我可能必须使用lookaheads或lookbehinds,但我不知道是否可能,因为断言的长度是可变的。此外,属性名称中可能有数量可变的点

可以用一行纸来完成吗?

试试这行:

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

太完美了!非常感谢(我现在还不能接受答案,我会在10分钟内回答)@jvallver我的答案可能会解决你的问题。但是我要说的是,java属性文件中prop name的命名约定是“点”,而不是下划线。我知道,但是Jenkins使用EnvInject插件解释名称中带有点的属性时遇到了麻烦。我尝试在一个具体的构建中解决这个问题,但通常使用点分隔属性:)
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