Ruby: Как избирательно удалить обертывание линии из текстового файла?
-
19-09-2019 - |
Вопрос
Я хочу отредактировать следующий текст, чтобы каждая строка начиналась с дилера:. Это означает, что нет перерывов обертывания/линии. Для линий, начиная с системы, обертывание в порядке.
Как будет выглядеть решение в Ruby? Спасибо
Это расположена в файле .txt
Дилер: 5 секунд осталось действовать
Дилер: Hitman2714 выигрывает горшок (9)
Дилер: Рука № 1684326626D
Дилер: Guitou699 осталось 5 секунд
действовать
Дилер: Guit699
Дилер: у Бадж Хасана осталось 5 секунд
действовать
Дилер: Бадж Хасан истекло
Дилер: Hitman2714 осталось 5 секунд
играть
Дилер: Hitman2714
Система: ночная гарантия $ 10 000
начнется через 20 минут
Дилер: Дилер: Рука № 1684326626D
Дилер: перспективные публикуют большие
слепой 25
Желаемый вывод:
Дилер: 5 секунд осталось действовать
Дилер: Hitman2714 выигрывает горшок (9)
Дилер: Рука № 1684326626D
Дилер: Guitou699 осталось 5 секунд, чтобы действовать
Дилер: Guit699
Дилер: у Бадж Хасана осталось 5 секунд, чтобы действовать
Дилер: Бадж Хасан истекло
Дилер: Hitman2714 осталось 5 секунд, чтобы действовать
Дилер: Hitman2714
Система: ночная гарантия $ 10 000
начнется через 20 минут
Дилер: Дилер: Рука № 1684326626D
Дилер: Перспекстичный публикует большой слепой 25
Решение
remove_newline = false
ARGF.each_line do |line|
if line =~ /^(Dealer|System): /
puts if remove_newline
remove_newline = ($1 == 'Dealer')
end
line.sub!(/\n/, ' ') if remove_newline
print line
end
Если вы не против устранить упаковку на строках «системы», и если файл достаточно мал, вы можете сделать что -то вроде этого:
puts ARGF.readlines.join('').gsub(/\n(?!Dealer: |System: )/, ' ')
Другие советы
previous = ''
ARGF.each_with_index do |line, i|
line.chomp!
unless i == 0
if line =~ /^Dealer/ || line =~ /^System/
puts previous
previous = line
else
previous << (previous =~ /^System/ ? "\n" : " ") << line
end
else
previous = line
end
end
puts previous
Использует Stdin и Stdout для ввода и вывода.
content.gsub(/^(.*)\n(?!(Dealer|System|\Z))/, '\1 ')
грип
Зачем использовать Ruby, если этот вид инструмента уже существует
cat oldfile | grep ^Dealer: > newfile
Рубин
Если это должно быть частью более крупного применения Ruby, то нет ничего плохого в том, чтобы сделать это в Ruby.
content= File.read(oldfile)
content= content.grep(/^Dealer:/)
File.open(newfile, "w") { |f| f.write(content) }