2011-02-13 11 views
6

Por favor, perdone mi ignorancia, soy nuevo con Ruby.Ruby: buscando una expresión regular a través de múltiples archivos en múltiples directorios

sé cómo buscar una cadena, o incluso un solo archivo con una expresión regular:

str = File.read('example.txt') 
match = str.scan(/[0-9A-Za-z]{8,8}/) 

puts match[1] 

sé cómo buscar una frase estática en varios archivos y directorios

pattern = "hello" 

Dir.glob('/home/bob/**/*').each do |file| 
    next unless File.file?(file) 
     File.open(file) do |f| 
      f.each_line do |line| 
       puts "#{pattern}" if line.include?(pattern) 
     end 
    end 
end 

No puedo entender cómo usar mi expresión regular contra múltiples archivos y directorios. Cualquier ayuda es muy apreciada.

Respuesta

5

Bueno, estás bastante cerca. En primer lugar hacer patrón de un objeto Regexp:

pattern = /hello/ 

O si usted está tratando de hacer una Regexp partir de una cadena (como pasa en la línea de comandos), puede intentar:

pattern = Regexp.new("hello") 
# or use first argument for regexp 
pattern = Regexp.new(ARGV[0]) 

Ahora, cuando se están buscando, line es una Cadena. Puede usar match o scan para obtener los resultados que coincidan con su patrón.

f.each_line do |line| 
    if line.match(pattern) 
    puts $0 
    end 
    # or 
    if !(match_data = line.match(pattern)).nil? 
    puts match_data[0] 
    end 
    # or to see multiple matches 
    unless (matches = line.scan(pattern)).empty? 
    p matches 
    end 
end 
+0

Muchas gracias por la respuesta. Tengo problemas para mostrar los resultados de la búsqueda de expresiones regulares. Supongo que el comando "puts" mostrará los datos coincidentes con la expresión regular correcta. – roobnoob

+0

Ah, imprimí la línea porque pensé que sería más útil. Actualizaré mi respuesta. – wuputah

+0

Muchas gracias por esto. Obtengo una 'coincidencia ': secuencia de bytes no válida en UTF-8 (ArgumentError). Sé que esto no tiene nada que ver con mi pregunta original. Investigaré este nuevo problema. ¡Gracias por responder mi pregunta original! – roobnoob

Cuestiones relacionadas