usar sirve que por parametros para linea como comandos ruby file printing line argv

ruby - por - para que sirve int argc char*argv[]



¿Cómo imprimo el número de línea del archivo con el que estoy trabajando a través de ARGV? (1)

Actualmente estoy abriendo un archivo tomado en tiempo de ejecución a través de ARGV:

File.open(ARGV[0]) do |f| f.each_line do |line|

Una vez que se encuentra una coincidencia, imprimo la salida para el usuario.

if line.match(/(strcpy)/i) puts "[!] strcpy does not check for buffer overflows when copying to destination." puts "[!] Consider using strncpy or strlcpy (warning, strncpy is easily misused)." puts " #{line}" end

Quiero saber cómo imprimir el número de línea para la línea coincidente en el archivo (ARGV [0]).

Usando print __LINE__ muestra el número de línea del script de Ruby. He intentado muchas variaciones diferentes de la print __LINE__ con diferentes interpolaciones de cadenas de #{line} sin éxito. ¿Hay alguna forma de que pueda imprimir el número de línea del archivo?


Cuando la clase de IO de Ruby abre un archivo, establece $. variable global a 0. Para cada línea que se lee esa variable se incrementa. Entonces, para saber qué línea se ha leído, simplemente use $. .

Mire en el módulo en inglés por $. o $INPUT_LINE_NUMBER .

También podemos usar el método lineno que es parte de la clase IO. Me resulta un poco más intrincado porque necesitamos un objeto de transmisión IO para agregarlo, mientras que $. funcionará siempre

Escribiría el ciclo más simplemente:

File.foreach(ARGV[0]) do |line|

Algo en lo que pensar es que, si está en un sistema * nix, puede usar la herramienta grep o fgrep incorporada del sistema operativo para acelerar su procesamiento. La familia de aplicaciones "grep" está altamente optimizada para hacer lo que desea, y puede encontrar todas las instancias, solo la primera, puede usar expresiones regulares o cadenas fijas, y se puede llamar fácilmente usando los operadores %x o backtick de Ruby.

puts `grep -inm1 abacus /usr/share/dict/words`

Qué salidas:

34:abacus

-inm1 significa "ignorar el caso del personaje", "números de línea de salida", "detener después de la primera aparición"