簡體   English   中英

Ruby正則表達式在文本文件中添加一行

[英]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')

Chomp Line Endings

你的行可能有換行符。 你需要以這種或那種方式處理這種方式。 例如,這對我來說很好:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM