Ruby 从文件中读取变量并替换
我有一个Apache2服务器端包含文件。它看起来像(实际数据已编辑):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}/
我不知道如何正确地执行此操作。如果您有一个等于文件文本的字符串:
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"}