我需要匹配输入的文本文件字符串中的一行,并将该捕获的行包裹在一个字符中。
例如想象一个文本文件:
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
它输出与文本文件完全相同的内容。
答案 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)
你的行可能有换行符。你需要以这种或那种方式处理这种方式。例如,这对我来说很好:
$ ruby -ne 'puts "X#{$_.chomp}X"' /tmp/corpus
XtestX
XfooX
XtestX
XbarX