【问题标题】:How to pass ruby variable into sed command in Shell?如何将 ruby​​ 变量传递给 Shell 中的 sed 命令?
【发布时间】:2013-08-23 10:38:07
【问题描述】:

这是我的代码。我想获取 p 的值并在匹配 1 时将其插入到文件 changed.txt 中。但它没有做我想做的事,似乎不知道 #{p} 是什么

Net::SSH.start( "192.168.2.1", "root", :password => "password") do |ssh|
    p = ssh.exec! "java -cp /var/lib/sonar/dev-tools.jar au.com.Tool test"
#   puts #{p}
    ssh.exec! "sed 's/1/#{p}/g' changed.txt"
end

【问题讨论】:

  • 你能分享一下它的实际作用吗?您的puts 调试语句应为puts "#{p}"#{p}sed 正则表达式中得到什么?我运行了一个类似的测试用例,它运行良好。
  • 我想将 1 替换为 p 的值; changed.txt 里面只包含 1 个。但是用当前的代码,changed.txt 还是有1,根本没有改变..

标签: ruby bash net-ssh


【解决方案1】:

p 值的传递方式应该可以正常工作。但是,sed 命令不会更改文件。如果您希望它就地更改文件,请使用 -i 选项,如下所示:

ssh.exec! "sed -i 's/1/#{p}/g' changed.txt"

或者,如果您想在不同的文件中进行更改,请使用:

ssh.exec! "sed 's/1/#{p}/g' changed.txt > newfile.txt"

另一种选择是:

ssh.exec! "sed -i 's/1/" + p + "/g' changed.txt"

【讨论】:

  • 我认为 's/1/#{p}/g' #{p} 也应该可以工作,但是,当它传递给 sed 时,它的值为 nil,因为 changed.txt 仍然相同, 没有改变。还要感谢您纠正我的调试放置“#{p}”。
  • @gugo,你的putsp 给你一个非零输出吗?在这种情况下p 的值是多少?
  • puts "#{p}" 实际上确实输出了值 619A72E67F796BD2。 dev-tools.jar 是一个生成加密文本的工具(在这种情况下是上面写的测试),我希望它替换 changed.txt 中的旧文本。
  • 嗨 mbratch,我发现如果我运行这个 p=2 ssh.exec! “sed -i 's/1/#{p}/' chaged.txt”,有效。但不是那个 p = ssh.exec! “java ....”,你知道为什么吗?
  • @gugo,就sed#{p} 而言,该功能似乎正在做正确的事情。但是您的 java exec 返回的 p 的值并不是您所期望的。如果它返回619A72E67F796BD2,那么它当然不会在您的文本文件中找到它。您需要调查java... 命令的执行情况。
猜你喜欢
  • 2019-02-16
  • 2017-12-15
  • 1970-01-01
  • 1970-01-01
  • 2019-09-11
  • 2015-01-08
  • 2019-09-15
  • 2015-08-05
  • 1970-01-01
相关资源
最近更新 更多