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

Regex 如何在使用sed替换文本时保留新行和格式?,regex,linux,bash,unix,sed,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'命令 $ query='SELECT COL1, > COL2, >

我有一个这样的模板文件

$ cat template.txt
QWERTY
~SQL~
ASDFG
我需要用以下文本替换模板文件中的
“~SQL~”
字符串。此文本存储在变量中

SELECT COL1,
       COL2,
       COL3
FROM TABLE;
我尝试了以下代码,但出现错误:sed:-e expression#1,char 20:unterminated`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
我希望在替换文本时保留新行和格式。如何实现此目标?

您可以使用此awk:

awk -v q="$query" '/~SQL~/{$0 = q} 1' file
QWERTY
SELECT COL1,
       COL2,
       COL3,
FROM TABLE;
ASDFG
您可以这样做:

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

伟大的这在anubhava起作用。谢谢你的回答:)但是如果template.txt有以下几行怎么办?
QWERT~SQL~ASDF
小心
sub()
,如果查询可以包含
&
或=,我想不太可能,
\
。我想我的要求很简单。template.txt文件有多行文本。其中一行是
~SQL~
。我只需要替换该行,其他行应按原样打印。很抱歉在原问题中没有明确说明这一点。我现在已经编辑了这个问题。1是打印的捷径,这是awk中的默认操作。它基本上是打印每一张记录。是的。谢谢阿努巴瓦。我从这里得到了“1”的含义-