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

时间:2013-04-13 19:17:29

标签: ruby regex gsub

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

例如想象一个文本文件:

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

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

5 个答案:

答案 0 :(得分:4)

如果您尝试匹配每个行,那么

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

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

答案 1 :(得分:4)

你可以这样做一行:

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

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

我喜欢这种方式,但当然也可以写成多行:

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

答案 2 :(得分:1)

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

包围它

示例:

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

答案 3 :(得分:1)

如果您的文件是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')

答案 4 :(得分:0)

Chomp Line Endings

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

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