我正在使用sed
进行一些查找/替换,并使用tee
来编写输出文件。这是命令
# $1 source
# $2 Type
# $3 name
# $4 body
sudo sed "s/<!--ID-->/1/g" ./templates/tpl.txt \
| sed "s/<!--AUTHOR-->/myname/g" \
| sed "s/<!--TYPE-->/$2/g" \
| sed "s/<!--BODY-->/$4/g" \
| sed "s/<!--NAME-->/$3/g" \
| tee "$3.txt" > /dev/null
在输出文件中,我看到“n”代替新行。我需要与以下相同的效果 (但在模板替换后)
echo -e "$4" > "$3.txt"
我是bash学习者,请帮我提供我的代码
$ 4包含带有注释等的多行字符串(例如mysql function /procedure or trigger)
谢谢
答案 0 :(得分:0)
如果您打算使用tee
来写入特权文件,则必须将sudo
与tee
一起使用。
你可以:
sed < template/tpl.txt -e "
s/<!--ID-->/1/g;
s/<!--AUTHOR-->/myname/g;
s/<!--TYPE-->/$2/g;
s/<!--NAME-->/$3/g;
/<!--BODY-->/{s/<!--BODY-->/$4/;s/\\n/\n/g;}
" | sudo tee "$3" >/dev/null
其他方式:在bash中,您可以使用:
echo "${4//\\n/$'\n'}"
这样:
sed "s/<!--BODY-->/${4//\\n/$'\n'}/;"
也可以。
使用Mac sed
这可能会更好:
sed < template/tpl.txt "s/<\!--ID-->/1/g;
s/<\!--AUTHOR-->/myname/g;
s/<\!--TYPE-->/$2/g;
s/<\!--BODY-->/${4//\\n/\\$'\n'}/
" | sudo tee "$3" >/dev/null
说明:${4//\\n/\\$'\n'}
是 bashism ,我们可以在您使用bash时使用。 Mac sed不支持\n
作为换行符,但如果使用反斜杠\
转义,则支持换行符,因此在 RHS 中,\n
可以写入( bash):\\$'\n'
:
echo abc\\$'\n'def
abc\
def