加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

用ruby删除前两行文件

发布时间:2020-12-17 02:16:24 所属栏目:百科 来源:网络整理
导读:我的脚本读入大型文本文件并使用正则表达式抓取第一页.我需要删除每个第一页的前两行或更改正则表达式以匹配== Page 1 ==字符串后的1行.我在这里包含了整个脚本,因为我已经被问到过去的问题,因为我是 ruby的新手,并不总是知道如何整合片段作为答案: #!/usr/
我的脚本读入大型文本文件并使用正则表达式抓取第一页.我需要删除每个第一页的前两行或更改正则表达式以匹配== Page 1 ==字符串后的1行.我在这里包含了整个脚本,因为我已经被问到过去的问题,因为我是 ruby的新手,并不总是知道如何整合片段作为答案:

#!/usr/bin/env ruby -wKU
require 'fileutils'

source = File.open('list.txt')
source.readlines.each do |line|
  line.strip!
  if File.exists? line
    file = File.open(line)
  end

  text = (File.read(line))
  match = text.match(/==Page 1(.*)==Page 2==/m)
  puts match
end

解决方法

现在,当你更新了你的问题时,我不得不删除这么好的答案的一大部分:-)

我想你的问题的主要问题是你想使用match [1]而不是匹配. Regexp.match方法(MatchData)返回的对象可以被视为一个数组,它将整个匹配的字符串保存为第一个元素,并将每个子查询保存在以下元素中.因此,在您的情况下,变量匹配(和匹配[0])是整个匹配的字符串(与’== Page .. ==’标记一起),但您只需要在匹配[1]中隐藏的第一个子表达式.

现在谈谈我在你的代码中感觉到的其他小问题.如果你已经知道我说的话,请不要被冒犯,但也许其他人会从警告中获益.

你的代码的第一部分(如果是File.exists?行)是检查文件是否存在,但是你的代码只是打开了文件(没有关闭它!)并??且仍然试图在几行之后打开文件.

您可以使用此行代替:

next unless File.exists? line

第二件事是程序应该准备好处理文件没有页面标记时的情况,因此它与模式不匹配. (变量匹配则为零)

第三个建议是可能会使用更复杂的模式.当前的一个(/ == Page 1 ==(.*)== Page 2 == / m)将返回页面内容,并将End-Of-Line标记作为第一个字符.如果您使用此模式:

/==Page 1==s*n(.*)==Page 2==/m

那么子表达式将不包含与’== Page 1 ==`文本放在同一行中的空格.如果你使用这种模式:

/==Page 1==s*n(.*n)==Page 2==/m

那么你将确保’== Page 2 ==’标记从该行的开头开始.

第四个问题是,程序员(有时包括我,当然)往往忘记在打开文件后关闭文件.在您的情况下,您已打开’source’文件,但在代码中,循环后没有source.close语句.处理文件最安全的方法是将块传递给File.open方法,因此您可以使用程序第一行的以下形式:

File.open('list.txt') do |source|
  source.readlines.each do |line|

……但在这种情况下,写下来会更清晰:

File.readlines('list.txt').each do |line|

总而言之,代码可能看起来像这样(我将变量行更改为fname以获得更好的代码可读性):

#!/usr/bin/env ruby -wKU
require 'fileutils'

File.readlines('list.txt').each do |fname|
  fname.strip!
  next unless File.exists? fname

  text = File.read(fname)
  if match = text.match(/==Page 1==s*n(.*n)==Page 2==/m)
    # The whole 'page' (String):
    puts match[1].inspect
    # The 'page' without the first two lines:
    # (in case you really wanted to delete lines):
    puts match[1].split("n")[2..-1].inspect
  else
    # What to do if the file does not match the pattern?
    raise "The file #{fname} does NOT include the page separators."
  end
end

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读