Ruby regex gsub una línea en un archivo de texto

Necesito hacer coincidir una línea en una cadena de archivo de texto ingresada y envolver esa línea capturada con un carácter, por ejemplo.

Por ejemplo imagina un archivo de texto como tal:

test foo test bar 

Me gustaría usar gsub para la salida:

 XtestX XfooX XtestX XbarX 

Aunque estoy teniendo problemas para hacer coincidir una línea. He intentado usar expresiones regulares comenzando con ^ y terminando con $, pero no parece funcionar. ¿Algunas ideas?

Tengo un archivo de texto que tiene lo siguiente:

 test foo test bag 

El archivo de texto se está leyendo como un argumento de línea de comandos.

Así que tengo

 string = IO.read(ARGV[0]) string = string.gsub(/^(test)$/,'X\1X') puts string 

Produce exactamente lo mismo que está en el archivo de texto.

Si estás tratando de hacer coincidir cada línea, entonces

 gsub(/^.*$/, 'X\&X') 

Hace el truco. Si solo desea hacer coincidir ciertas líneas, entonces reemplace .* Con lo que necesite.

Actualizar:

Reemplazando tu gsub con el mío:

 string = IO.read(ARGV[0]) string = string.gsub(/^.*$/, 'X\&X') puts string 

Yo obtengo:

 $ gsub.rb testfile
 XtestX
 XfooX
 XtestX
 XbarX

Actualización 2:

Según @CodeGnome, puede intentar agregar chomp :

 IO.readlines(ARGV[0]).each do |line| puts "X#{line.chomp}X" end 

Esto funciona igual de bien para mí. Mi comprensión de ^ y $ en expresiones regulares era que no sería necesario masticar, pero tal vez me equivoque.

Puedes hacerlo en una línea como esta:

 IO.write(filepath, File.open(filepath) {|f| f.read.gsub(//\d+<\/appId>/, "42"/)}) 

IO.write trunca el archivo dado de manera predeterminada, por lo que si lee el texto primero, realice la expresión regular String.gsub y devuelva la cadena resultante utilizando File.open en modo de bloque, reemplazará el contenido del archivo de una sola vez.

Me gusta la forma en que se lee, pero también se puede escribir en varias líneas, por supuesto:

 IO.write(filepath, File.open(filepath) do |f| f.read.gsub(//\d+<\/appId>/, "42"/) end ) 

string.gsub(/^(matchline)$/, 'X\1X') Utiliza una referencia inversa (\ 1) para obtener el primer grupo de captura de la expresión regular y rodearlo con X

Ejemplo:

 string = "test\nfoo\ntest\nbar" string.gsub!(/^test$/, 'X\&X') p string => "XtestX\nfoo\nXtestX\nbar" 

Si su archivo es input.txt , haría lo siguiente

 File.open("input.txt") do |file| file.lines.each do |line| puts line.gsub(/^(.*)$/, 'X\1X') end end 
  • (.*) permite capturar cualquier carácter y lo convierte en una variable Regexp
  • \1 en la cadena de reemplazo es ese grupo capturado

Si prefiere hacerlo en una línea en todo el contenido, puede hacerlo de la siguiente manera:

  File.read("input.txt").gsub(/^(.*)$/, 'X\1X') 

Finales de línea de chomp

Tus líneas probablemente tienen caracteres de nueva línea. Necesitas manejar esto de una manera u otra. Por ejemplo, esto funciona bien para mí:

 $ ruby -ne 'puts "X#{$_.chomp}X"' /tmp/corpus XtestX XfooX XtestX XbarX