如何使用sed替换文本时保留新行和格式?

时间:2015-07-06 16:26:15

标签: regex linux bash unix sed

我有一个像这样的模板文件

$ cat template.txt
QWERTY
~SQL~
ASDFG

我需要用以下文本替换模板文件中的"~SQL~"字符串。该文本存储在变量

SELECT COL1,
       COL2,
       COL3
FROM TABLE;

我尝试了以下代码,但收到了错误: sed:-e expression#1,char 20:unterminated`s s命令

$ query='SELECT COL1,
>        COL2,
>        COL3
> FROM TABLE;'
$ 
$ sed "s/~SQL~/$query/" template.txt
sed: -e expression #1, char 20: unterminated `s' command

如果我从"query"删除新行,则sed命令可以正常工作

$ query='SELECT COL1, COL2, COL3 FROM TABLE;'
$ sed "s/~SQL~/$query/" template.txt
QWERTY
SELECT COL1, COL2, COL3 FROM TABLE;
ASDFG

我想在替换文本时保留新行和格式。我如何实现这一目标?

2 个答案:

答案 0 :(得分:2)

你可以使用这个awk:

awk -v q="$query" '/~SQL~/{$0 = q} 1' file
QWERTY
SELECT COL1,
       COL2,
       COL3,
FROM TABLE;
ASDFG

答案 1 :(得分:0)

你可以这样做:

query='SELECT COL1,\n       COL2,\n       COL3\nFROM TABLE;'
sed "s/~SQL~/$query/" template.txt