He buscado esto un poco pero debo estar usando los términos incorrectos - ¿Ruby tiene una forma de grep para una cadena/expresión regular y también devuelve las 5 líneas circundantes (arriba y abajo)? Sé que podría llamar al "grep -C 5 ..."
o incluso escribir mi propio método, pero parece que algo de rubí tendría y simplemente no estoy usando los términos de búsqueda correctos.Ruby equivalente a "grep -C 5" para obtener el contexto de las líneas alrededor del partido?
Respuesta
Usted puede hacerlo con una expresión regular. Aquí está la cadena que desea buscar:
s = %{The first line
The second line
The third line
The fourth line
The fifth line
The sixth line
The seventh line
The eight line
The ninth line
The tenth line
}
EOL es "\ n" para mí, pero para usted puede ser que sea "\ r \ n". Yo me quedo en una constante:
EOL = '\n'
Para simplificar la expresión regular, vamos a definir el patrón de "contexto" una sola vez:
CONTEXT_LINES = 2
CONTEXT = "((?:.*#{EOL}){#{CONTEXT_LINES}})"
Y vamos a buscar cualquier línea que contiene la palabra "quinto". Tenga en cuenta que esta expresión regular debe tomar toda la línea, incluyendo la línea de fin de, para que funcione:
regexp = /.*fifth.*#{EOL}/
Por último, hacer la búsqueda y mostrar los resultados:
s =~ /^#{CONTEXT}(#{regexp})#{CONTEXT}/
before, match, after = $1, $2, $3
p before # => "The third line\nThe fourth line\n"
p match # => "The fifth line\n"
p after # => "The sixth line\nThe seventh line\n"
No creo que pueda suministrar args a grep; basado en el api.
Siempre puede escribir un método. Algo a lo largo de las líneas de esto:
def new_grep(enum, pattern, lines)
values = enum.grep(/pattern/).map do |x|
index = enum.index(x)
i = (index - lines < 0) ? 0 : index - lines
j = (index + lines >= enum.length) ? enum.length-1 : index + lines
enum[i..j]
end
return values.flatten.uniq
end
Éste podría funcionar también, pero encontré que la respuesta de Wayne era más acorde con lo que yo quería. – wonderfulthunk
Gracias por el grep contextual Pensé que podría agregar, que cuando la coincidencia se acerca a la parte superior o inferior y aún desea que todas las líneas puedan igualarse sin todas las líneas CONTEXT_LINES disponibles, puede cambiar la definición de CONTEXTO para que sea como sigue:
CONTEXT = "((?:.*#{EOL}){0,#{CONTEXT_LINES}})"
Por defecto, las coincidencias son codiciosos, por lo que si parte o la totalidad de las líneas CONTEXT_LINES disponibles, eso es lo que va a agarrar.
- 1. ¿Por qué partido grep todas las líneas para el patrón "\ '"
- 2. Grep caracteres antes y después del partido?
- 3. Grep Regex: enumere todas las líneas excepto
- 4. equivalente a grep -v Rubí
- 5. Equivalente a ps -A | grep -c proceso en Windows?
- 6. Encontrar puntos en las curvas en HTML 5 2d Contexto del lienzo
- 7. Grep ignora líneas múltiples
- 8. ¿Cómo puedo grep para líneas de código enteras, posiblemente envueltas?
- 9. partido varias líneas con una expresión regular en C#
- 10. Grep con las comillas
- 11. líneas de impresión en el archivo desde la línea de partido hasta el final del archivo
- 12. ¿Cómo me deshago de "-" separador de línea cuando uso grep con líneas de contexto?
- 13. ¿La mejor técnica para obtener el contexto del paquete OSGi?
- 14. ¿Puedo grep solo las primeras n líneas de un archivo?
- 15. C# equivalente al símbolo Ruby
- 16. Equivalente a "continuar" en Ruby
- 17. ¿Archivo Java .properties equivalente para Ruby?
- 18. pruebas unitarias, LINQ a SQL y trabajar alrededor del Contexto de datos
- 19. ¿Cómo usar grep para obtener algo justo después de `name =`?
- 20. grep/grep rápido solo para el número de línea?
- 21. grep como comando para encontrar líneas coincidentes más líneas de vecindad
- 22. Equivalente a Ruby Enumerable # each_slice en Javascript?
- 23. Necesita ayuda de RegExp para Linux Bash grep comando para filtrar las líneas que contienen corchetes
- 24. Equivalente de cURL para Ruby?
- 25. expresiones regulares (GREP) para la búsqueda de varias líneas necesitaba
- 26. equivalente a Scala del mapa de Ruby. Cada uno?
- 27. Equivalente a #region para C++
- 28. powershell obtener el número de líneas del archivo grande (grande)
- 29. Regex partido de cualquier carácter 5 o más veces
- 30. Equivalente a window.setTimeout() para C++
Esto fue genial, gracias! Funciona a las mil maravillas. Tuve que volver y volver a leer que el final de línea debe incluirse en la expresión regular que estoy buscando, me lo perdí cuando probé esto inicialmente. – wonderfulthunk
Esto debería funcionar: /.*fifth.*[#{EOL}]*/ Ver http://rubular.com/r/skalXLBXcQ –