Ruby 在文件中搜索字符串并在字符串匹配后读取该行
我想在一个文件中查找一个字符串,并输出该字符串后面的行的其余部分——但不包括换行符等 [文件内容]Ruby 在文件中搜索字符串并在字符串匹配后读取该行,ruby,Ruby,我想在一个文件中查找一个字符串,并输出该字符串后面的行的其余部分——但不包括换行符等 [文件内容] [Test] key1 = value key2 = value2 [Test2] key1 = value3 key3 = value4 value5 例如,我希望在测试部分中搜索键1时读取“value”。当我在Test2部分中搜索key3时,我希望得到“value4 value5”作为字符串 我目前的做法是: section = Test key = key1 text =
[Test]
key1 = value
key2 = value2
[Test2]
key1 = value3
key3 = value4 value5
例如,我希望在测试部分中搜索键1时读取“value”。当我在Test2部分中搜索key3时,我希望得到“value4 value5”作为字符串
我目前的做法是:
section = Test
key = key1
text = File.read(path)
# read complete section in value
sect_value = text.scan(/^[section]=(.+)$/).flatten.first
# read specific key from section
value = sect_value.scan(/^key =(.+)$/)
ruby软件包是否已经安装了configparser(无需添加更多gems)?这是您所期望的吗
require 'FileUtils'
section = ARGV[0]
v_key = ARGV[1]
section_found = "n"
f = File.open("myinputfile.txt", "r")
f.each_line do |line|
if line.include? section
section_found = 'y'
end
if section_found == 'y'
if line.include? v_key
puts "\nValues for #{section} - #{v_key} :::::::::"
puts(line.split('=')[1])
break # Necessary to prevent reading same keys from subsequent sections
end
end
end
f.close()
输出
让我们首先构造一个文件
FNAME = 't'
File.write(FNAME, <<~END
cat
[Test]
key1 = value
key2 = value2
[Test2]
key1 = value3
key3 = value4 value5
dog
END
)
#=> 90
为了
正则表达式的计算如下所示
rkey_match = /\A *#{key} *= /
#=> /\A *cat *= /
rkey_get = /\A *#{key} *= *\K.*/
#=> /\A *cat *= *\K.*/
在rkey\u get
中,\K
松散地表示忘记迄今为止匹配的所有内容
根据需要,在构造正则表达式时可能需要一些调整。到目前为止,您尝试了什么?请出示代码我添加了我目前的方法,但我对正则表达式不太熟悉。你能控制文件结构吗?您不能使用YAML或JSON吗?不幸的是,我无法控制该文件。该文件是由python程序创建的。默认ruby引擎中没有configparser?如果line.include?section:我可以再次检查它是否是以[和]开头并以[结束]结尾的节吗?执行脚本时只需更改命令行中的输入:ruby line\u after\u string\u match.rb
[Test]
key1
def extract(section, key)
rkey_match = /\A *#{key} *= /
rkey_get = /\A *#{key} *= *\K.*/
section_found = false
File.foreach(FNAME, chomp:true) do |line|
if line.strip == section
section_found = true
elsif section_found
return line[rkey_get] if line.match?(rkey_match)
end
end
nil
end
extract('[Test]', 'key1')
#=> "value"
extract('[Test2]', 'key3')
#=> "value4 value5"
extract('[Test]', 'key7')
#=> nil
extract('[Test3]', 'key1')
#=> nil
section = "[Test2]"
key = "key3"
rkey_match = /\A *#{key} *= /
#=> /\A *cat *= /
rkey_get = /\A *#{key} *= *\K.*/
#=> /\A *cat *= *\K.*/