Replace a word with multiple lines using sed?
You can do this with AWK using variable substitution. We can set a variable in AWK using -v
, and then use AWK's gsub
function to substitute all occurrences of a regular expression with that variable.
For example, if the file test
has the following contents ...
foo
bar
blah _data_and_data_
foo
_data_ foobar _data_ again
... and the Bash variable $DATA
is ...
1
2
3
4
5
... then awk -v r=$DATA '{gsub(/_data_/,r)}1' test
replaces all occurrences of the regular expression _data_
in the file test
with the contents of $DATA
, resulting in the following:
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
ring bearer's answer didn't work for me; I think the usage of tr
there is wrong, and the way it's written, it simply strips away newlines by use of echo
.
Instead, I used sed
. I used code from another answer to replace newlines (credit: Zsolt Botykai). I also expected some dollar signs ($
) in my input so I took care of that too. You might need to add other input handling. Note the use of double quotes in echo
to preserve newlines.
DATA="$(cat whatever)"
ESCAPED_DATA="$(echo "${DATA}" | sed ':a;N;$!ba;s/\n/\\n/g' | sed 's/\$/\\$/g')"
Then you can use ${ESCAPED_DATA}
in sed
:
cat input | sed 's/one liner/'"${ESCAPED_DATA}"'/' > output
Just thought I'd share.
If you build your multiple line text with "\n
"s, this will work with a simple sed
command as:
DATA=`echo ${DATA} | tr '\n' "\\n"`
#now, DATA="line1\nline2\nline3"
sed "s/_data_/${DATA}/" mail.tpl
I would suggest simply replacing sed with perl command like this:
perl -i.bak -pe 's/_data_/$ENV{"DATA"}/g' mail.tpl