Ruby正则表达式在文本文件中添加一行

我需要匹配输入的文本文件字符串中的一行,并将该捕获的行包裹在一个字符中。

例如,想象一个文本文件:

test foo test bar 

我想用gsub输出:

 XtestX XfooX XtestX XbarX 

我在匹配线路时遇到了麻烦。 我尝试使用正则表达式从^开始并以$结尾,但它似乎不起作用。 有任何想法吗?

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

 test foo test bag 

正在将文本文件作为命令行参数读入。

所以我得到了

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

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

如果你想匹配每一行,那么

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

诀窍。 如果您只想匹配某些行,则将.*替换为您需要的任何内容。

更新:

用我的替换你的gsub

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

我明白了:

 $ gsub.rb testfile
 XtestX
 XfooX
 XtestX
 XbarX

更新2:

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

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

这对我来说同样有效。 我对正则表达式中的^$理解是没有必要进行咀嚼,但也许我错了。

你可以在一行中这样做:

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

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

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

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

string.gsub(/^(matchline)$/, 'X\1X')使用反向引用(\ 1)获取正则表达式的第一个捕获组,并用X包围它

例:

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

如果你的文件是input.txt ,我会这样做

 File.open("input.txt") do |file| file.lines.each do |line| puts line.gsub(/^(.*)$/, 'X\1X') end end 
  • (.*)允许捕获任何字符并使其成为变量Regexp
  • 字符串替换中的\1是捕获的组

如果您希望在整个内容的一行中执行此操作,则可以执行以下操作

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

Chomp Line Endings

你的行可能有换行符。 你需要以这种或那种方式处理。 例如,这对我来说很好:

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