用sed替换多行的单词?

时间:2012-04-11 13:59:41

标签: bash replace sed

我正在制作一个bash脚本,必须准备一封电子邮件发送给用户。

它会聚合一些数据,最终会产生多行内容。对于存储在$DATA

中的示例

现在,经过一段时间的努力后,我发现了sed -ei "s/_data_/${DATA}/g" mail.tplsed replace with variable with multiple lines之类的内容。他们都没有工作。

现在的问题是,我如何让sed用多行文字替换某些内容?

sed的替代方案也欢迎!)

9 个答案:

答案 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。

相关问题