我需要匹配输入的文本文件字符串中的一行,并用例如字符将捕获的行换行。
例如,假设一个文本文件如下:
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)
它输出与文本文件中完全相同的内容。
如果您要匹配每一行,那么
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)
这对我来说同样有效。我的理解^,并$在正则表达式是大嚼不会是必要的,但也许我错了。
您可以像这样在一行中完成:
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)