1

我想编辑以下文本,使每一行都以 Dealer: 开头。这意味着没有换行/换行。对于以 System 开头的行,换行很好。

ruby 中的解决方案是什么样的?谢谢

这位于 .txt 文件中

庄家:还剩 5 秒采取行动
庄家:hitman2714 赢得底池 (9)
庄家:手牌 #1684326626D
庄家:Guitou699 还剩 5 秒
采取行动
庄家:Guit¤u699 已超时
庄家:baj Hasan 还剩 5 秒
采取行动
庄家: baj Hasan 已超时
庄家:hitman2714 还剩 5 秒
采取行动
庄家:hitman2714 已超时
系统:每晚 10,000 美元的保证
将在 20 分钟后开始
庄家:庄家:手牌 #1684326626D
庄家:Perspextive 发布
25 的大盲注

期望的输出:

庄家:还剩 5 秒采取行动
庄家:hitman2714 赢得底池 (9)
庄家:手牌 #1684326626D
庄家:Guitou699 还剩 5 秒采取行动
庄家:Guit¤u699 已超时
庄家:baj Hasan 还剩 5 秒采取行动
庄家: baj Hasan 已超时
庄家:hitman2714 还剩 5 秒采取行动
庄家:hitman2714 已超时
系统:每晚 10,000 美元的保证
将在 20 分钟后开始
庄家:庄家:手牌 #1684326626D
庄家:Perspextive 发布 25 的大盲注

4

4 回答 4

2
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: )/, ' ')
于 2009-12-16T14:23:18.603 回答
1
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 进行输入和输出。

于 2009-12-16T12:39:00.107 回答
1
content.gsub(/^(.*)\n(?!(Dealer|System|\Z))/, '\1 ')
于 2009-12-26T20:12:23.867 回答
0

grep

如果这种工具已经存在,为什么还要使用 ruby

cat oldfile | grep ^Dealer: > newfile

红宝石

如果这应该是更大的 ruby​​ 应用程序的一部分,那么在 ruby​​ 中执行它并没有错。

content= File.read(oldfile)
content= content.grep(/^Dealer:/)
File.open(newfile, "w") { |f| f.write(content) }
于 2009-12-16T19:15:21.477 回答