Ruby regex gsub文本文件中的一行

Tom*_*mmy 2 ruby regex gsub

我需要匹配输入的文本文件字符串中的一行,并用例如字符将捕获的行换行。

例如,假设一个文本文件如下:

test
foo
test
bar
Run Code Online (Sandbox Code Playgroud)

我想用gsub输出:

XtestX
XfooX
XtestX
XbarX
Run Code Online (Sandbox Code Playgroud)

我在匹配一条线时遇到了麻烦。我试过使用以^开头和以$结束的正则表达式,但是它似乎不起作用。有任何想法吗?

我有一个文本文件,其中包含以下内容:

test
foo
test
bag
Run Code Online (Sandbox Code Playgroud)

该文本文件正在作为命令行参数读取。

所以我得到了

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

puts string
Run Code Online (Sandbox Code Playgroud)

它输出与文本文件中完全相同的内容。

Dar*_*tle 5

如果您要匹配每一行,那么

gsub(/^.*$/, 'X\&X')
Run Code Online (Sandbox Code Playgroud)

绝招。如果只想匹配某些行,请替换.*为所需的行。

更新:

gsub用我的代替:

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

我得到:

$ gsub.rb测试文件
XtestX
XfooX
XtestX
XbarX

更新2:

根据@CodeGnome,您可以尝试添加chomp

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

这对我来说同样有效。我的理解^,并$在正则表达式是大嚼不会是必要的,但也许我错了。


Ste*_*ner 5

您可以像这样在一行中完成:

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

IO.write默认情况下会截断给定的文件,因此如果您先阅读文本,执行正则表达式String.gsub并使用File.open块模式返回结果字符串,它将一举替换文件的内容。

我喜欢它的读取方式,但当然也可以写成多行:

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