Найдите строку в файле и прочтите строку после совпадения строки - PullRequest
0 голосов
/ 08 мая 2020

Я хотел бы найти строку в файле и вывести оставшуюся часть строки после этой строки, но без новой строки et c.

[Содержимое файла]

 [Test]
 key1 = value
 key2 = value2

 [Test2]
 key1 = value3
 key3 = value4 value5

Например, я хотел бы прочитать «значение» при поиске Key1 в разделе «Тест». Когда я ищу key3 в разделе Test2, я хотел бы получить "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 =(.+)$/)

Есть ли configparser, который уже установлен пакет ruby (без добавления дополнительных драгоценных камней)?

Ответы [ 2 ]

0 голосов
/ 09 мая 2020

Давайте сначала создадим файл.

FNAME = 't'

File.write(FNAME, <<~END
cat
[Test]
 key1 = value
 key2 = value2

[Test2]
 key1 = value3
 key3 = value4 value5
dog
END
)
  #=> 90

Для извлечения интересующих значений можно использовать следующий метод.

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

В rkey_get, \K в общих чертах означает забыть все, что было найдено до сих пор.

В зависимости от требований могут потребоваться некоторые настройки в построении регулярного выражения.

0 голосов
/ 08 мая 2020

Это то, что вы ожидаете?

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()

Вывод

$ ruby line_after_string_match.rb Test key1

Values for Test - key1 :::::::::
 value


$ ruby line_after_string_match.rb Test2 key3

Values for Test2 - key3 :::::::::
 value4 value5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...