【问题标题】:Replace Text using variables in Sed not working使用 Sed 中的变量替换文本不起作用
【发布时间】:2020-09-29 10:12:14
【问题描述】:

我需要使用 Sed 修改一个 xml 文件来替换该行

url="jdbc:oracle:thin:@//ttpdbscan.axel.net:1521/axel.telco.net"

url="jdbc:oracle:thin:@//ttpdbscan.axeltelecom.net:1598/axelPRD.telco.net"

我已经存储了这样的行

ACTUAL_DB=$(sed -n 's#^.*url="\(.*\).*"#\1#p' $FILE.xml)

NEW_DB="jdbc:oracle:thin:@//ttpdbscan.axeltelecom.net:1598/axelPRD.telco.net"

替换方法就是这个

sed -i "s#$ACTUAL_DB#$NEW_DB#g" $File.xml

问题是当我运行脚本时文件保持不变。

我已经回显了变量并且它们都返回了正确的值。

【问题讨论】:

  • 虽然不建议使用 sed 修改 xml(改用 xmlstarlet 之类的工具),但我认为给定的示例和使用的 sed 命令没有任何问题..
  • 如果你这样做sed "s#$ACTUAL_DB#$NEW_DB#g" $File.xml > new.xml会发生什么新文件是否有修改内容?
  • 能否添加echo ${ACTUAL_DB}的输出
  • sed -i "s#${ACTUAL_DB}#${NEW_DB}#g" File.xml?如果File.xml 是路径,则不应在其中添加$
  • 当我回显 ACTUAL_DB 时,它显示了正确的值。我做了一个测试,我创建了另一个变量并分配了 sed 与该新变量一起使用的硬编码文本,如果我将它与我得到的那个进行比较,则表明它们是相同的

标签: unix sed


【解决方案1】:

所以我将输出保存到另一个文件中,发现字符串有多余的空间

原来是这样的

ACTUAL_DB= "jdbc:oracle:thin:@//ttpdbscan.axel.net:1521/axel.telco.net "

我用

删除了多余的空间
"$(echo -e "${ACTUAL_DB}" | tr -d '[:space:]')"

现在 sed 正在按预期工作

【讨论】:

    【解决方案2】:

    假设您拥有的文件是File.xml(如果它不是变量),您可以使用

    sed -i "s#${ACTUAL_DB}#${NEW_DB}#g" File.xml
    

    也可以尝试使用其他分隔符:

    sed -i "s~${ACTUAL_DB}~${NEW_DB}~g" File.xml
    

    如果您的sed 不支持-i,请使用

    sed "s~${ACTUAL_DB}~${NEW_DB}~g" File.xml 1<> File.xml
    

    sed edit file in place

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-06
      • 2017-12-20
      • 1970-01-01
      • 2017-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-06
      相关资源
      最近更新 更多