我的要求是检查特定文件夹中的任何文件中是否存在给定字符串(从文本文件中读取),如果是 存储并打印匹配字符串行的第一个单词。
以下是代码段
.......
.......
my_files.each do |file_name|
puts "File Name: #{file_name}"
content = File.read(file_name)
changed = content.gsub( /#{Regexp.escape(id_value)}/, '' ) #'id_value' is from the first level loop ,stores string value(for every iteration).
if content.include?("#{id_value}")
print "its there\n"
Row = content.split.first
puts "From: #{Row}"
end
文件夹中的一个文件
CDA created on September 20th 1999
Owner: Edward Jenner
Access IDs,
id = class\234ha, class\poi23, class\opiuj, cap\7y6t5
dept = sub\6985de, ret\oiu87, class\234ha
如果id_value是 class \ 234ha
对于第一次迭代,它应该将输出设为'id'和'dept',但输出为'CDA'。此外,我也面临着以下警告。
test.rb:19:警告:已初始化常量Row test.rb:19: 警告:Row的先前定义来自:class \ poi23
请提出任何建议。我也寻找其他选择,但都没有用.Beginner to ruby如此友好地原谅我的无知。谢谢。
答案 0 :(得分:0)
如果有这样的事情:
File.open(' sample.txt')。grep(/ class \ 234ha /){| line | line.split.first} => [" id"," dept"]
将块传递给grep方法
答案 1 :(得分:0)
以下是我所拥有的脚本示例,可以满足您的需求。如果您使用文件对象的each_line
方法,它会相当紧张。
#!/usr/bin/env ruby
regex_to_find = Regexp.new Regexp.escape(ARGV[0])
files = Dir.glob ARGV[1]
files.each do |f|
current_file = File.new f
current_file.each_line do |l|
if l =~ regex_to_find
puts "#{f} #{current_file.lineno}: first word = #{l.split.first}, full line: #{l}"
end
end
end
如果您在包含上面显示的数据的文件的目录上运行此脚本。你得到以下输出。我认为你在寻找什么。
$ ./q43950329.rb 'class\234ha' "*"
q43950329_data 4: first word = id, full line: id = class\234ha, class\poi23, class\opiuj, cap\7y6t5
q43950329_data 5: first word = dept, full line: dept = sub\6985de, ret\oiu87, class\234ha
请注意,上面的输出位于名为q43950329.rb的文件中,当前目录中存在以下文件,名为q43950329_data
CDA created on September 20th 1999
Owner: Edward Jenner
Access IDs,
id = class\234ha, class\poi23, class\opiuj, cap\7y6t5
dept = sub\6985de, ret\oiu87, class\234ha