Bash echo -e等效使用sed和tee

时间:2013-01-29 07:34:03

标签: bash

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

谢谢

1 个答案:

答案 0 :(得分:0)

如果您打算使用tee来写入特权文件,则必须将sudotee一起使用。

你可以:

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

其他方式:在中,您可以使用:

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 ,我们可以在您使用时使用。 Mac sed不支持\n作为换行符,但如果使用反斜杠\转义,则支持换行符,因此在 RHS 中,\n可以写入( bash):\\$'\n'

echo abc\\$'\n'def
abc\
def