Ruby 正则小脚本处理空行
Ruby学了主要作用大概也就是写写脚本了(毕竟传说中的Python/Ruby二选一),躺在床上想到因为复制黏贴下来少回车,在有的Markdown中会解析为没换行,有的则是<br/>
,这让人非常的烦躁!所以需要处理一下,怎么处理最快——用脚本。
首先先匹配,在Ruby正则表达式中,+
匹配一次或以上,我们需要匹配\n
,所以需要用多行的模式m
。
re = Regexp.new(/\n+/m)
匹配替换用的是String.gsub
方法。表示替换全部,sub
只替换首次匹配的部分。
result = file.gsub(re, "\n\n")
在这里出现了个变量file
,file
需要我们去读取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
这里报错的同时告诉了你格式。
最终效果:
植入部分
如果您觉得文章不错,可以通过赞助支持我。
如果您不希望打赏,也可以通过关闭广告屏蔽插件的形式帮助网站运作。