Ruby 正则小脚本处理空行

Ruby学了主要作用大概也就是写写脚本了(毕竟传说中的Python/Ruby二选一),躺在床上想到因为复制黏贴下来少回车,在有的Markdown中会解析为没换行,有的则是<br/>,这让人非常的烦躁!所以需要处理一下,怎么处理最快——用脚本。

首先先匹配,在Ruby正则表达式中,+匹配一次或以上,我们需要匹配\n,所以需要用多行的模式m

re = Regexp.new(/\n+/m)

匹配替换用的是String.gsub方法。表示替换全部,sub只替换首次匹配的部分。

result = file.gsub(re, "\n\n")

在这里出现了个变量filefile需要我们去读取n的个数,所以不能使用getLine系列,只能直接read,之后存好。

file = File.read(fileReg)

写入的时候,我们开只写模式(覆盖)

file = File.open(fileReg, "w")
size = file.write(result)
file.close

open就要对应close,匹配修改部分就写完了。

这是一个简单的成品,Terminal里传入值来进行匹配修改(遵循bash规则):

def fileSearch(fileRoute)
    re = Regexp.new(/\n+/m)

    file = File.read(fileRoute)
    result = file.gsub(re, "\n\n")
    file = File.open(fileRoute, "w")
    size = file.write(result)
    file.close
    p fileRoute + " Has Done"

end

ARGV.each do |fileRoute|
    fileSearch(fileRoute)
end

接下来我们复杂一些,这个只能够匹配对应文件夹,显然不够给力,我们想要有cd dirname的效果,加上一个method:

def changeDir(dirRoute)
    dir = Dir.chdir(dirRoute)    # 更改路径
    puts "Dir has been changed : " + `pwd`
end

接下来我们把传入的第一个变量变成目标地址,第二个值是匹配。

那么下面就应该这么修改:

    changeDir(ARGV[0])
    finds = Dir.glob(ARGV[1])
    finds.each do |fileReg|
        fileLocate(fileReg)
    end

glob是一个Dir的方法,传入字符串进行匹配,所以传入时我们需要用单引号保证原意。

接着可能遇到的问题就是,万一我输入的格式不对,怎么办,友好考虑,我们需要使用try...catch,在Ruby里就是begin...rescue,全部思考完毕,接下来我们来看看完整的代码:

def changeDir(dirRoute)
    dir = Dir.chdir(dirRoute)    # 更改路径
    puts "Dir has been changed : " + `pwd`
end

def fileLocate(fileReg)
    re = Regexp.new(/\n+/m)

    file = File.read(fileReg)
    result = file.gsub(re, "\n\n")
    file = File.open(fileReg, "w")
    size = file.write(result)
    file.close
    p fileReg + " has Done"

end

begin
    changeDir(ARGV[0])
    finds = Dir.glob(ARGV[1])
    finds.each do |fileReg|
        fileLocate(fileReg)
    end
rescue
    puts "Some Error, check your inputs:"
    puts "ruby dir.rb <routes> '<file>'"
end

这里报错的同时告诉了你格式。

最终效果:
屏幕快照 2015-08-26 17.56.29.png

植入部分

如果您觉得文章不错,可以通过赞助支持我。

如果您不希望打赏,也可以通过关闭广告屏蔽插件的形式帮助网站运作。

标签: 成品, 源码, 知识, 代码段, 语法

添加新评论