我正在制作一个bash脚本,必须准备一封电子邮件发送给用户。
它会聚合一些数据,最终会产生多行内容。对于存储在$DATA
。
现在,经过一段时间的努力后,我发现了sed -ei "s/_data_/${DATA}/g" mail.tpl
和sed replace with variable with multiple lines之类的内容。他们都没有工作。
现在的问题是,我如何让sed
用多行文字替换某些内容?
(sed
的替代方案也欢迎!)
答案 0 :(得分:13)
您可以使用变量替换使用AWK执行此操作。我们可以使用-v
在AWK中设置变量,然后使用AWK的gsub
函数用该变量替换所有正则表达式。
例如,如果文件test
具有以下内容......
foo
bar
blah _data_and_data_
foo
_data_ foobar _data_ again
...而Bash变量$DATA
是......
1
2
3
4
5
...然后awk -v r=$DATA '{gsub(/_data_/,r)}1' test
用_data_
的内容替换文件test
中所有出现的正则表达式$DATA
,结果如下:
foo
bar
blah 1
2
3
4
5and1
2
3
4
5
foo
1
2
3
4
5 foobar 1
2
3
4
5 again
答案 1 :(得分:12)
如果使用“\n
”构建多行文本,则可以使用简单的sed
命令:
DATA=`echo ${DATA} | tr '\n' "\\n"`
#now, DATA="line1\nline2\nline3"
sed "s/_data_/${DATA}/" mail.tpl
答案 2 :(得分:10)
我尝试了它并sed 's/pattern/\na\nb\nc/g'
但它并不适用于所有系统。在替换模式中使用\
后跟换行符的工作是什么,如下所示:
sed 's/pattern/a\
b\
c/g'
当看到模式时,会附加包含b
的行和包含c
的行。
要将其放入变量中,请使用双反斜杠:
export DATA="\\
a\\
b\\
c"
然后:
sed "s/pattern/${DATA}/g"
请注意双引号。
答案 3 :(得分:9)
我建议简单地用perl命令替换sed:
perl -i.bak -pe 's/_data_/'"${DATA}"'/g' mail.tpl
答案 4 :(得分:9)
tr
的用法存在错误,以及编写方式,它只是使用echo
删除换行符。
相反,我使用sed
。我使用another answer中的代码替换换行符(credit:Zsolt Botykai)。我也期望在我的输入中有一些美元符号($
),所以我也照顾好了。您可能需要添加其他输入处理。请注意在echo
中使用双引号来保留换行符。
DATA="$(cat whatever)"
ESCAPED_DATA="$(echo "${DATA}" | sed ':a;N;$!ba;s/\n/\\n/g' | sed 's/\$/\\$/g')"
然后您可以在${ESCAPED_DATA}
中使用sed
:
cat input | sed 's/one liner/'"${ESCAPED_DATA}"'/' > output
想到我分享。
答案 5 :(得分:1)
将变量转换为临时文本文件。
将文本文件插入mail.tpl并从mail.tpl删除数据
echo ${DATA} > temp.txt
sed -i -e "/_data_/r temp.txt" -e "//d" mail.tpl
答案 6 :(得分:1)
使用\
(除了最后一个)转义所有换行符对我有用。
不得转义最后一个换行符,以免破坏s
命令。
示例:
DATA="a
b
c"
ESCAPED=$(echo "${DATA}" | sed '$!s@$@\\@g')
echo "${ESCAPED}"
a\
b\
c
sed "s/pattern/${ESCAPED}/" file
答案 7 :(得分:0)
您可以将数据放入临时文件中并运行:
$ sed '/_data_/r DATA_FILE' mail.tpl | sed '/_data_/d'> temp; mv temp mail.tpl
答案 8 :(得分:0)
不确定您是否尝试将“\ n”放在替换部分
中END
出于可读性的原因,第一行有/ \。之后的每一行都是一个独立的行,就像你在文本编辑器中找到的一样。由于可读性原因,最后一行是独立的。如果需要,您可以制作所有这一行。当我测试它时,可以使用Debian Jessie。