我正在尝试使用sed替换pgbouncer.ini中的[databases]
[databases]
db = host=localhost port=5432 dbname=db user=r00t password=xyz
这是我的bash脚本:
CR=$(printf '\r')
sed "s/\[databases\]\$/\[databases\]$CR db = host=localhost port=5432 dbname=db user=r00t password=xyz/" pg.ini
不幸的是,我只是显示了这个:
db = host=localhost port=5432 dbname=db user=r00t password=xyz
更新
变量会导致接受的答案出现问题。我收到错误:
sed:-e表达式#1,字符127:命令后的额外字符
sed -i "/\[databases\]/a\
main_db = host=${MAIN_DB_LOC} port=5432 dbname=${MAIN_DB} user=r00t password=${MAIN_DB_PASSWORD}
audit_db = host=${AUDIT_DB_LOC} port=5432 dbname=${AUDIT_DB} user=r00t password=${AUDIT_DB_PASSWORD}
lat_lng_db = host=${LAT_LNG_DB_LOC} port=5432 dbname=${LAT_LNG_DB} user=r00t password=${AUDIT_DB_PASSWORD}
" /etc/pgbouncer/pgbouncer.ini
答案 0 :(得分:1)
而不是CR,使用新行,\n
中的sed
(Unix上的LF):
$ sed 's/\[databases\]$/&\ndb = host=localhost port=5432 dbname=db user=r00t password=xyz/' pg.ini
此外,行尾锚$
不需要转义(如果在单引号下使用),您可以使用&
重新使用匹配的字符串( [databases]
)替换字符串。
使用port
变量:
$ port=5432
$ sed 's/\[databases\]$/&\ndb = host=localhost port='"$port"' dbname=db user=r00t password=xyz/' pg.ini
(注意我们需要使用双引号来展开$port
,这就是我们连接单引号和双引号sed
子字符串的原因,例如'x'"y"'z'
。)
答案 1 :(得分:0)
你可以像这样使用a
追加命令:
sed -i '/\[databases\]/a\
db = host=localhost port=5432 dbname=db user=r00t password=xyz
' file
以下是如何将port用作变量:
port='5432'
sed -i '/\[databases\]/a\
db = host=localhost port='"$port"' dbname=db user=r00t password=xyz
' file
或者如图所示,如果有一长串变量,您可以使用此sed
:
sed -i "/\\[databases\\]/a\\
main_db = host=${MAIN_DB_LOC} port=5432 dbname=${MAIN_DB} user=r00t password=${MAIN_DB_PASSWORD}\\
audit_db = host=${AUDIT_DB_LOC} port=5432 dbname=${AUDIT_DB} user=r00t password=${AUDIT_DB_PASSWORD}\\
lat_lng_db = host=${LAT_LNG_DB_LOC} port=5432 dbname=${LAT_LNG_DB} user=r00t password=${AUDIT_DB_PASSWORD}\\
" file
请注意,由于\\
命令中存在双引号,因此请使用\
代替sed
。
或者,您可以使用r
sed
命令将文件内容放入输出中。
# create a temporary file with the text to be placed after [databases]
echo 'db = host=localhost port=5432 dbname=db user=r00t password=xyz' > file.tmp
# Copy the contents of file to the standard output after search string
sed -i.bak '/\[databases\]/r file.tmp' file
答案 2 :(得分:0)
sed用于单个行的简单替换,全部。对于其他任何你应该使用awk:
awk '{print} $0=="[databases]"{print "db = host=localhost port=5432 dbname=db user=r00t password=xyz"}' file
以上内容适用于任何UNIX系统上任何shell中的任何awk,当目标字符串包含regexp元字符或分隔符(例如/
在sed中为默认值)时也不会失败,当你的附加字符串也不会失败包含反向引用(例如&
或\1
)。那是因为它使用严格的字符串操作,而sed不支持。