[英]Ruby regex gsub a line in a text file
我需要匹配輸入的文本文件字符串中的一行,並將該捕獲的行包裹在一個字符中。
例如,想象一個文本文件:
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(//<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
)
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')
你的行可能有換行符。 你需要以這種或那種方式處理這種方式。 例如,這對我來說很好:
$ ruby -ne 'puts "X#{$_.chomp}X"' /tmp/corpus
XtestX
XfooX
XtestX
XbarX
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.