Bash:sed在遇到“&”时出现问题

时间:2018-10-04 10:38:00

标签: bash

我有一个配置文件,用于存储键值,然后将其覆盖在实际属性文件中。我下面有用于此目的的代码,它对于其中没有'&'的键值可以正常工作。

从配置文件中获取所需的值:

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

1 个答案:

答案 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