【问题标题】:How to find & replace a pattern with string in ruby?如何在ruby中用字符串查找和替换模式?
【发布时间】:2016-04-19 06:26:22
【问题描述】:

我的文件是:

[root@test 等]# cat nrpe.cfg
命令[check_users]=/usr/local/nagios/libexec/check_users -w 30 -c 35 命令[check_load]=/usr/local/nagios/libexec/check_load -w 15,10,5 -c 30,25,20 命令[check_disk]=/usr/local/nagios/libexec/check_disk -w 20% -c 10% -p /dev/sda1 命令[check_hda]=/usr/local/nagios/libexec/check_disk -w 20% -c 10% -p /dev/sdb 命令[check_procs]=/usr/local/nagios/libexec/check_procs -w 200 -c 250 我想在 ruby​​ 中用 /dev/xvda1 替换 /dev/sdb

【问题讨论】:

    标签: ruby regex shell


    【解决方案1】:

    首先让我们将文本写入文件:

    str =<<BITTER_END
    command[check_users]=/usr/local/nagios/libexec/check_users -w 30 -c 35
    command[check_load]=/usr/local/nagios/libexec/check_load -w 15,10,5 -c 30,25,20
    command[check_disk]=/usr/local/nagios/libexec/check_disk -w 20% -c 10% -p /dev/sda1
    command[check_hda]=/usr/local/nagios/libexec/check_disk -w 20% -c 10% -p /dev/sdb
    command[check_procs]=/usr/local/nagios/libexec/check_procs -w 200 -c 250
    BITTER_END
    
    Fname_in  = "in"
    Fname_out = "out"
    
    File.write(Fname_in, str)
      #=> 390
    

    现在将该文件读入字符串,修改字符串并将其写入输出文件:

    File.write(Fname_out, File.read(Fname_in).gsub("/dev/sdb", "/dev/xvda1"))
      #=> 392
    

    让我们确认它有效:

    puts File.read(Fname_out)
    command[check_users]=/usr/local/nagios/libexec/check_users -w 30 -c 35
    command[check_load]=/usr/local/nagios/libexec/check_load -w 15,10,5 -c 30,25,20
    command[check_disk]=/usr/local/nagios/libexec/check_disk -w 20% -c 10% -p /dev/sda1
    command[check_hda]=/usr/local/nagios/libexec/check_disk -w 20% -c 10% -p /dev/xvda1
    command[check_procs]=/usr/local/nagios/libexec/check_procs -w 200 -c 250
    

    【讨论】:

      【解决方案2】:

      您可以根据一行中出现的次数使用gsubsub

      line = "command[check_hda]=/usr/local/nagios/libexec/check_disk -w 20% -c 10% -p /dev/sdb"
      line.gsub("/dev/sdb", "/dev/xvda1")
      #=> "command[check_hda]=/usr/local/nagios/libexec/check_disk -w 20% -c 10% -p /dev/xvda1"
      

      由于它在一个文件中,你可以迭代为:

      File.open("/your/file", "r") { |file| file.each_line { |line|
      puts line.gsub("/dev/sdb", "/dev/xvda1")
      }}
      

      【讨论】:

      • gsubsub 有什么区别?
      • gsub 替换所有出现的模式,sub 将仅替换第一次出现。我在回答中提供了链接,请浏览文档。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-20
      • 1970-01-01
      相关资源
      最近更新 更多