Ruby regex gsub a line in a text file
Solution 1
If you're trying to match every line, then
gsub(/^.*$/, 'X\&X')
does the trick. If you only want to match certain lines, then replace .*
with whatever you need.
Update:
Replacing your gsub
with mine:
string = IO.read(ARGV[0])
string = string.gsub(/^.*$/, 'X\&X')
puts string
I get:
$ gsub.rb testfile XtestX XfooX XtestX XbarX
Update 2:
As per @CodeGnome, you might try adding chomp
:
IO.readlines(ARGV[0]).each do |line|
puts "X#{line.chomp}X"
end
This works equally well for me. My understanding of ^
and $
in regular expressions was that chomping wouldn't be necessary, but maybe I'm wrong.
Solution 2
You can do it in one line like this:
IO.write(filepath, File.open(filepath) {|f| f.read.gsub(//<appId>\d+<\/appId>/, "<appId>42</appId>"/)})
IO.write
truncates the given file by default, so if you read the text first, perform the regex String.gsub
and return the resulting string using File.open
in block mode, it will replace the file's content in one fell swoop.
I like the way this reads, but it can be written in multiple lines too of course:
IO.write(filepath, File.open(filepath) do |f|
f.read.gsub(//<appId>\d+<\/appId>/, "<appId>42</appId>"/)
end
)
Solution 3
If your file is input.txt
, I'd do as following
File.open("input.txt") do |file|
file.lines.each do |line|
puts line.gsub(/^(.*)$/, 'X\1X')
end
end
(.*)
allows to capture any characters and makes it a variable Regexp\1
in the string replacement is that captured group
If you prefer to do it in one line on the whole content, you can do it as following
File.read("input.txt").gsub(/^(.*)$/, 'X\1X')
Solution 4
string.gsub(/^(matchline)$/, 'X\1X')
Uses a backreference (\1) to get the first capture group of the regex, and surround it with X
Example:
string = "test\nfoo\ntest\nbar"
string.gsub!(/^test$/, 'X\&X')
p string
=> "XtestX\nfoo\nXtestX\nbar"
Tommy
Updated on October 10, 2022Comments
-
Tommy over 1 year
I need to match a line in an inputted text file string and wrap that captured line with a character for example.
For example imagine a text file as such:
test foo test bar
I would like to use gsub to output:
XtestX XfooX XtestX XbarX
I'm having trouble matching a line though. I've tried using regex starting with ^ and ending with $, but it doesn't seem to work. Any ideas?
I have a text file that has the following in it:
test foo test bag
The text file is being read in as a command line argument.
So I got
string = IO.read(ARGV[0]) string = string.gsub(/^(test)$/,'X\1X') puts string
It outputs the exact same thing that is in the text file.