【问题标题】:Replace text in a variable by another variable用另一个变量替换变量中的文本
【发布时间】:2015-10-03 11:52:21
【问题描述】:

我想用另一个变量替换一个变量中的一些文本。

body='{ "server": {
    "metadata": "metaToReplace"
  }
}'
meta="{
  ARTS_ORACLE_INT_IP: 10.120.47.151,
  ARTS_USER: performance
}"

我试过了,但没有用:

body=$(echo "${body}" | sed "s|\"metaToReplace\"|${meta}|g")

我收到了这个错误:

sed: -e expression #1, char 19: unterminated `s' command

【问题讨论】:

  • 请将代码缩进 4 个空格以启用等宽和语法高亮。

标签: json bash replace sed


【解决方案1】:

问题是双引号没有被放入body 字符串中。由于您使用双引号开始字符串,因此内引号只是匹配该字符串并结束字符串。在它周围使用单引号,以便内部引号将按字面意思处理,而不是作为分隔符。

body='{ "server": {
    "metadata": "metaToReplace"
  }
}'

【讨论】:

    【解决方案2】:

    替换变量中的换行符破坏了s/// 命令的语法:

    $ echo "${body}" | sed "s|\"metaToReplace\"|${meta}|g"
    sed: -e expression #1, char 19: unterminated `s' command
    

    我会使用 awk:您可以将 shell 变量的内容传输到 awk 变量:

    body=$( awk -v rep="$meta" '{gsub(/"metaToReplace"/, rep); print}' <<< "$body" )
    

    【讨论】:

    • 谢谢,它的工作!我没有考虑换行:S
    【解决方案3】:

    你可以这样做:

    meta="$(echo "$meta" |sed ':a;N;s/\n/\\n/;ta;')"
    body=$(echo "${body}" | sed "s|\"metaToReplace\"|$meta|g")
    echo "$body"
    

    输出:

    { "server": {
        "metadata": {
      ARTS_ORACLE_INT_IP: 10.120.47.151,
      ARTS_USER: performance
    }
      }
    }
    

    它是如何工作的:

    echo "$meta" |sed ':a;N;s/\n/\\n/;ta;'
    

    meta 中的所有换行符替换为字母\n,因此meta 成为单行字符串:

    {\n  ARTS_ORACLE_INT_IP: 10.120.47.151,\n  ARTS_USER: performance\n}
    

    然后将其用作替换字符串,在替换中,\n 再次被解释为新行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-11-17
      • 2012-10-16
      • 2014-03-13
      • 1970-01-01
      • 2018-09-22
      • 1970-01-01
      • 2019-09-01
      相关资源
      最近更新 更多