Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 在文件中搜索字符串并在字符串匹配后读取该行_Ruby - Fatal编程技术网

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.*/