2012-03-19 31 views
1

如何使用ruby打开文本文件,并删除包含“关键短语”的行。使用Ruby去除行

我不想只将关键短语删除,我需要包含要删除的短语的完整行。

+0

在文件中还是在读入内容中? – Linuxios 2012-03-19 13:13:43

回答

5

事情是这样的:

File.open(output_file, "w") do |ofile| 
    File.foreach(input_file) do |iline| 
    ofile.puts(iline) unless iline =~ Key_phrase 
    end 
end 
+0

我用我想打开的文本文件的名称替换淡蓝色的单词“文件”? – 2012-03-19 13:20:10

+1

不,这就是'output_file'和'input_file'的作用。如果您稍后更新您的问题,我会相应地更新答案。 – 2012-03-19 13:22:26

+0

你在'do'之前的第一行错过了''''。 – Linuxios 2012-03-19 13:47:57

1

这是一次性的,独立的任务吗?编辑文件到位? 如果是以下的一行可能会派上用场:

ruby -i.bak -ne 'print unless /key phrase/' file-to-hack.txt 

这改变了文件,并备份原来的。 如果您要使用这个大计划的一部分,加上环周围的每一行..

+0

或者没有Ruby:'sed -i.bak -ne'/关键短语/ d'文件名.txt'。 – 2012-03-19 13:41:20

+0

当然,如果我们打开问题的范围。顺便说一句,s/ruby​​/perl /上面的另一个答案:) – inger 2012-03-19 15:52:50

0

另一种方法是使用红宝石内(而不是从命令行)就地编辑:

#!/usr/bin/ruby 

def inplace_edit(file, bak, &block) 
    old_argv = Array.new(ARGV) 
    old_stdout = $stdout 
    ARGV.replace [file] 
    ARGF.inplace_mode = bak 
    ARGF.lines do |line| 
     yield line 
    end 
    ARGV.replace old_argv 
    $stdout = old_stdout 
end 

inplace_edit 'test.txt', '.bak' do |line| 
    print line unless line.match(/something/) 
    print line.gsub(/search1/,"replace1") 
end 

如果您不想创建备份,然后将'.bak'更改为''。