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