3

たとえば、入力されたテキスト ファイルの文字列の行を一致させ、そのキャプチャした行を文字でラップする必要があります。

たとえば、次のようなテキスト ファイルを想像してください。

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

テキストファイルにあるものとまったく同じものが出力されます。

4

5 に答える 5

5

次のように 1 行で実行できます。

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
)
于 2013-09-20T10:00:02.150 に答える
5

すべての行を一致させようとしている場合は、

gsub(/^.*$/, 'X\&X')

トリックを行います。特定の行のみを一致させたい場合は、.*必要なものに置き換えます。

アップデート:

あなたを私のものに置き換えるgsub

string = IO.read(ARGV[0])
string = string.gsub(/^.*$/, 'X\&X')
puts string

私は得る:

$ gsub.rb テストファイル
XtestX
XfooX
XtestX
XbarX

更新 2:

@CodeGnome に従って、以下を追加してみてくださいchomp:

IO.readlines(ARGV[0]).each do |line|
  puts "X#{line.chomp}X"
end

これは私にとっても同様にうまくいきます。^および正規表現についての私の理解で$は、チョッピングは必要ないということでしたが、間違っているかもしれません。

于 2013-04-13T19:29:43.970 に答える
2

あなたのファイルがの場合input.txt、私は次のようにします

File.open("input.txt") do |file|
  file.lines.each do |line|
    puts line.gsub(/^(.*)$/, 'X\1X')
  end
end
  • (.*)任意の文字をキャプチャして、変数の正規表現にすることができます
  • \1文字列の置換では、そのキャプチャされたグループです

コンテンツ全体で 1 行で実行したい場合は、次のように実行できます。

 File.read("input.txt").gsub(/^(.*)$/, 'X\1X')
于 2013-04-13T19:23:03.970 に答える