Ruby 从文件中读取变量并替换

Ruby 从文件中读取变量并替换,ruby,Ruby,我有一个Apache2服务器端包含文件。它看起来像(实际数据已编辑): 我不知道如何正确地执行此操作。如果您有一个等于文件文本的字符串: txt = <<-TXT <!--#set var="FIRST_VAR" value="HI" --> <!--#set var="SECOND_VAR" value="THERE" --> <!--#set var="FINAL_VAR" value="HEY/${FIRST_VAR}/${SECOND_VAR}/

我有一个Apache2服务器端包含文件。它看起来像(实际数据已编辑):


我不知道如何正确地执行此操作。

如果您有一个等于文件文本的字符串:

txt = <<-TXT
<!--#set var="FIRST_VAR" value="HI" -->
<!--#set var="SECOND_VAR" value="THERE" -->
<!--#set var="FINAL_VAR" value="HEY/${FIRST_VAR}/${SECOND_VAR}/${FINAL_VAR}" -->
TXT
正则表达式的格式基本上与文件中包含的格式相同,只是引号被转义,匹配组是使用
(.+)
定义的

尽管正则表达式可能更好,但您也可以使用
split
,采用更暴力的方式:

txt.split("\n").map do |line|
  var, rest = line.split("var=\"")[1].split("\" value=\"")
  value = rest.split("\"")[0]
  [var, value]
end

如果您的字符串等于文件的文本:

txt = <<-TXT
<!--#set var="FIRST_VAR" value="HI" -->
<!--#set var="SECOND_VAR" value="THERE" -->
<!--#set var="FINAL_VAR" value="HEY/${FIRST_VAR}/${SECOND_VAR}/${FINAL_VAR}" -->
TXT
正则表达式的格式基本上与文件中包含的格式相同,只是引号被转义,匹配组是使用
(.+)
定义的

尽管正则表达式可能更好,但您也可以使用
split
,采用更暴力的方式:

txt.split("\n").map do |line|
  var, rest = line.split("var=\"")[1].split("\" value=\"")
  value = rest.split("\"")[0]
  [var, value]
end

假设您将文件读入一个字符串,将该字符串分隔成几行,并从每行的末尾去除空白

arr =<<_.lines.map(&:strip)
<!--#set var="V1" value="HI" -->
<!--#set var="V2" value="THERE" -->
<!--#set var="FV" value="HEY/${V1}/${V2}" -->
_
  #=> ["<!--#set var=\"V1\" value=\"HI\" -->",
  #    "<!--#set var=\"V2\" value=\"THERE\" -->",
  #    "<!--#set var=\"FV\" value=\"HEY/${V1}/${V2}\" -->"]
最后,修改关键点

g.each_with_object({}) { |(k,v),h| h[k[r4]] = v }
  #=> {"V1"=>"HI", "V2"=>"THERE", "FV"=>"HEY/HI/THERE"}

当然,上面的两个表达式可以链接起来。事实上,它可以写为一行,但我不建议这样做。

假设您将文件读入一个字符串,将该字符串分隔为几行,并从每行的末尾去除空白

arr =<<_.lines.map(&:strip)
<!--#set var="V1" value="HI" -->
<!--#set var="V2" value="THERE" -->
<!--#set var="FV" value="HEY/${V1}/${V2}" -->
_
  #=> ["<!--#set var=\"V1\" value=\"HI\" -->",
  #    "<!--#set var=\"V2\" value=\"THERE\" -->",
  #    "<!--#set var=\"FV\" value=\"HEY/${V1}/${V2}\" -->"]
最后,修改关键点

g.each_with_object({}) { |(k,v),h| h[k[r4]] = v }
  #=> {"V1"=>"HI", "V2"=>"THERE", "FV"=>"HEY/HI/THERE"}

当然,上面的两个表达式可以链接起来。事实上,它可以写成一行,但我不推荐它。

这是多么干净有趣。至少在我缺乏经验的头脑中。我可以到达那里,尽管我的方法不那么干净。但是,我仍然不确定如何以干净的方式替换嵌入的变量引用,例如FIRST_VAR等。有什么想法或提示吗?有趣的是这是多么干净。至少在我缺乏经验的头脑中。我可以到达那里,尽管我的方法不那么干净。但是,我仍然不确定如何以干净的方式替换嵌入的变量引用,例如FIRST_VAR等。有什么想法或提示吗?
g.each_with_object({}) { |(k,v),h| h[k[r4]] = v }
  #=> {"V1"=>"HI", "V2"=>"THERE", "FV"=>"HEY/HI/THERE"}