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

Posted

技术标签:

【中文标题】如何在使用 sed 替换文本时保留新行和格式?【英文标题】:How to preserve new lines and formatting while substituting text using sed? 【发布时间】:2015-09-23 21:37:33 【问题描述】:

我有一个这样的模板文件

$ cat template.txt
QWERTY
~SQL~
ASDFG

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

SELECT COL1,
       COL2,
       COL3
FROM TABLE;

我尝试了以下代码,但出现错误:sed: -e expression #1, char 20: unterminated `s' command

$ 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

我想在替换文本时保留新行和格式。我如何做到这一点?

【问题讨论】:

【参考方案1】:

你可以使用这个 awk:

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

【讨论】:

太棒了!这有效@anubhava。感谢您的回答:) 但是如果 template.txt 有以下几行 QWERT ~SQL~ ASDF 如果查询可以包含& 或=,请注意sub(),我想不太可能是\<digit> 我想我的要求很简单。 template.txt 文件有多行文本。其中一行将是~SQL~。我只需要替换该行,其他行应按原样打印。很抱歉在原始问题中没有明确说明这一点。我现在已经编辑了问题。 1 是打印的快捷方式,它是 awk 中的默认操作。它基本上是打印每条记录。 是的。谢谢阿努巴瓦。我从这里得到了“1”的含义 - unix.stackexchange.com/questions/63891/…【参考方案2】:

你可以这样做:

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

【讨论】:

以上是关于如何在使用 sed 替换文本时保留新行和格式?的主要内容,如果未能解决你的问题,请参考以下文章

将 SED 与新行一起使用

如何使用 sed 或 awk 正确查找和替换多行文本?

Bash:从脚本中查找并替换文本

如何使用 XSL 在 XML 中的特定 td 中保留新行和空白

使用 GNU sed 和 GNU find 时如何加速替换?

如何使用 sed 或 awk 命令用变量(变量保存 Unix 脚本)查找和替换文本