0

我想出了如何搜索文件以根据用户输入定位特定字符串,但我不知道一旦找到该字符串后如何删除它。我见过各种 grep 方法,但不知道如何将它们更改为输入/输出,所以我最终得到了这个:

puts "Enter media to delete";
characters = gets.chomp;

File.open("arraystarter.rb").each { |line| 
  unless characters.each_char.map  { |c| line.include?(c) }.include? false
    puts "Did you mean #{line}?";
  intent = gets.chomp.downcase
  case intent
  when 'yes'
  # TODO: Delete the line I've found
   puts "#{line} deleted!"
  when 'no'
  puts "Nevermind, then."
  end
  end
    }

我需要在“是”之后替换 puts/"deleted" 行,但是如何?

4

3 回答 3

1

我为您的问题找到了非常好的解决方案,它有点复杂:它将文件转换为字符串,然后转换为数组,删除未处理的行,然后将数组打印回文件。我在一个真正的脚本中转换了您的一小段代码,该脚本查找有多少行包含用户输入,然后询问您是要全部删除还是只删除其中一个。我花了一点时间将代码带到这个版本,但我喜欢挑战(也许你现在笑了,想“挑战?这个?”....对我来说这是一个挑战,因为我还有很多事情要做了解 Ruby)。希望能帮助到你...

puts "Enter media to delete:"
characters = gets.chomp()
filename = "arraystarter.rb"
counts = 0

file_open = File.readlines(filename, 'rb')
file_to_string = file_open.map(&:inspect).join(',')
string = file_to_string.delete "\""
$array = string.split(/\\r/)
$array = string.split(/\\n/)

$array.map do |l|
  c = l.include? "#{characters}"
  counts += 1 if c == true
  next if c == true
end

def delete_all(characters)
  $array.each do |l|
  l.replace("") if l.include? characters
end
end

def puts_what(ct, l, c)
  if ct == 1 then puts "Did you mean #{l}?"
  else puts "#{c} exist in #{ct} lines. Do you want to delete all of them or just #{l}?" end
end

if string.include? "#{characters}"
  $array.each do |row|
  if row.include? "#{characters}" then puts_what(counts, row, characters)
    intent = gets.chomp()
    if intent == "yes"
      $array.delete row
      open_again = File.open(filename, 'w+')
      open_again.puts $array
      open_again.close()
      puts "#{row} deleted!"
      break
    elsif intent == "all"
      if counts == 1 then break end
      delete_all(characters)
      $array.delete ""
      open_once_more = File.open(filename, 'w+')
      open_once_more.puts $array
      open_once_more.close()
      puts "All the lines that contain #{characters} are deleted!"
      break
    elsif intent == "no" then puts "Never mind, then."
    end
  end
  end
else
  puts "Can't find #{characters}"
end

它可以 100% 完美运行!这个脚本唯一的坏处是它总是在文件末尾留下一个空行,但如果你对此没有任何问题,你可以使用这个脚本就好了。

PS:它使用就地编辑,因此不建议用于大文件,它会占用您的资源。

PPS:我的脚本又长又复杂,所以如果任何高级 Ruby 程序员想要改进我的脚本,欢迎他或她!

于 2013-07-20T13:08:57.163 回答
0

您会发现,sub('some text', '')或者您也可以使用sub,根据您的需要,可用于将找到的一个或多个单词替换为 nil,有效地“删除”它。

于 2013-05-15T23:41:58.280 回答
0

如果您在 UNIX 风格的机器(Linux、Mac OS X)上运行代码,您可以作弊并在系统调用中使用 sed 命令。

puts "Enter media to delete";
characters = gets.chomp;

system("sed s/#{characters}// arraystarter.rb > output.rb")

如果您需要在纯 Ruby 中运行它并使其具有高性能,请使用 Google 'Knuth-Morris-Pratt algorithm' 或查看此示例代码

如果这是某种家庭作业,那么这些建议都不是可行的方法。

于 2013-05-16T04:23:52.250 回答