0

我正在做一些查找/替换的事情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函数 /procedure 或 trigger )

谢谢

4

1 回答 1

0

如果您打算tee用于写入特权文件,则必须使用sudowith 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

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

echo "${4//\\n/$'\n'}" 

所以:

sed "s/<!--BODY-->/${4//\\n/$'\n'}/;"

也可以工作。

使用 Macsed这可能会更好:

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
于 2013-01-29T07:40:53.990 回答