【问题标题】:How to preserve new lines and formatting while substituting text using sed?如何在使用 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

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

【问题讨论】:

    标签: regex linux bash unix sed


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-02-04
      • 1970-01-01
      • 1970-01-01
      • 2011-02-03
      • 2014-04-24
      • 2014-11-06
      • 1970-01-01
      相关资源
      最近更新 更多