我有一个配置文件,用于存储键值,然后将其覆盖在实际属性文件中。我下面有用于此目的的代码,它对于其中没有'&'的键值可以正常工作。
从配置文件中获取所需的值:
postgresql_url=$(grep "^postgresql.url=" ./<file_name> |cut -d= -f2,3,4,5)
上面的代码给了我
jdbc:postgresql://ec2-22-222-2-22.eu-central-1.compute.amazonaws.com:111/d3bxxxx2cj1?password=xyz&user=user1&sslmode=require
我试图用上面的值覆盖下面的值
app1.postgresql.url=jdbc:postgresql://ec2-11-111-1-139.eu-west-1.compute.amazonaws.com:222/d53hyyyy928s0?password=abc&user=user1&sslmode=require
sed:但是在替换后给了我这个输出:
sed -i -e '/postgresql.url[[:blank:]]*=/ s|=.*|='$postgresql_url'|' $property_file
结果:
app1.postgresql.url=jdbc:postgresql://ec2-22-222-2-22.eu-central-1.compute.amazonaws.com:111/d3bxxxx2cj1?password=xyz=jdbc:postgresql://ec2-11-111-1-139.eu-west-1.compute.amazonaws.com:222/d53hyyyy928s0?password=abc&user=user1&sslmode=requireuser=user1=jdbc:postgresql://ec2-11-111-1-139.eu-west-1.compute.amazonaws.com:222/d53hyyyy928s0?password=abc&user=user1&sslmode=requiresslmode=require
如您所见,替换不是必需的。如何在sed替换中忽略'&'并得到以下结果:
app1.postgresql.url=jdbc:postgresql://ec2-22-222-2-22.eu-central-1.compute.amazonaws.com:111/d3bxxxx2cj1?password=xyz&user=user1&sslmode=require
答案 0 :(得分:0)
如何在&
的替换字符串中转义\
(也就是在每个&
之前添加sed
)?
有关使用sed
在变量内转义特殊字符的一点解释可以在here中找到。
以下是您的案例的示例脚本:
#!/bin/bash
mkdir temp && cd temp
# Create the property file (in which url needs to be replaced)
echo 'app1.postgresql.url=jdbc:postgresql://ec2-11-111-1-139.eu-west-1.compute.amazonaws.com:222/d53hyyyy928s0?password=abc&user=user1&sslmode=require' >> property
# The new url
postgresql_url='jdbc:postgresql://ec2-22-222-2-22.eu-central-1.compute.amazonaws.com:111/d3bxxxx2cj1?password=xyz&user=user1&sslmode=require'
# Escape &
postgresql_url=$(echo "${postgresql_url}" | sed -r 's/[&]/\\&/g')
# For sed
pattern='app1\.postgresql\.url=.*$'
replacement="app1.postgresql.url=${postgresql_url}"
# Replace
sed -i -r "s;${pattern};${replacement};g" property