如何用sed添加回车?

时间:2017-10-11 18:42:21

标签: bash ubuntu sed

我正在尝试使用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

3 个答案:

答案 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不支持。