Ruby 正则小脚本处理空行
Ruby学了主要作用大概也就是写写脚本了(毕竟传说中的Python/Ruby二选一),躺在床上想到因为复制黏贴下来少回车,在有的Markdown中会解析为没换行,有的则是
<br/>
,这让人非常的烦躁!所以需要处理一下,怎么处理最快——用脚本。
首先先匹配,在Ruby正则表达式中,+
匹配一次或以上,我们需要匹配\n
,所以需要用多行的模式m
。
1re = Regexp.new(/\n+/m)
2
匹配替换用的是String.gsub
方法。表示替换全部,sub
只替换首次匹配的部分。
1result = file.gsub(re, "\n\n")
2
在这里出现了个变量file
,file
需要我们去读取\n的个数,所以不能使用getLine系列,只能直接read,之后存好。
1file = File.read(fileReg)
2
写入的时候,我们开只写模式(覆盖)
1file = File.open(fileReg, "w")
2size = file.write(result)
3file.close
4
open就要对应close,匹配修改部分就写完了。
这是一个简单的成品,Terminal里传入值来进行匹配修改(遵循bash规则):
1def fileSearch(fileRoute)
2 re = Regexp.new(/\n+/m)
3
4 file = File.read(fileRoute)
5 result = file.gsub(re, "\n\n")
6 file = File.open(fileRoute, "w")
7 size = file.write(result)
8 file.close
9 p fileRoute + " Has Done"
10
11end
12
13ARGV.each do |fileRoute|
14 fileSearch(fileRoute)
15end
16
接下来我们复杂一些,这个只能够匹配对应文件夹,显然不够给力,我们想要有cd dirname
的效果,加上一个method:
1def changeDir(dirRoute)
2 dir = Dir.chdir(dirRoute) # 更改路径
3 puts "Dir has been changed : " + `pwd`
4end
5
接下来我们把传入的第一个变量变成目标地址,第二个值是匹配。
那么下面就应该这么修改:
1 changeDir(ARGV[0])
2 finds = Dir.glob(ARGV[1])
3 finds.each do |fileReg|
4 fileLocate(fileReg)
5 end
6
glob
是一个Dir的方法,传入字符串进行匹配,所以传入时我们需要用单引号保证原意。
接着可能遇到的问题就是,万一我输入的格式不对,怎么办,友好考虑,我们需要使用try...catch
,在Ruby里就是begin...rescue
,全部思考完毕,接下来我们来看看完整的代码:
1def changeDir(dirRoute)
2 dir = Dir.chdir(dirRoute) # 更改路径
3 puts "Dir has been changed : " + `pwd`
4end
5
6def fileLocate(fileReg)
7 re = Regexp.new(/\n+/m)
8
9 file = File.read(fileReg)
10 result = file.gsub(re, "\n\n")
11 file = File.open(fileReg, "w")
12 size = file.write(result)
13 file.close
14 p fileReg + " has Done"
15
16end
17
18begin
19 changeDir(ARGV[0])
20 finds = Dir.glob(ARGV[1])
21 finds.each do |fileReg|
22 fileLocate(fileReg)
23 end
24rescue
25 puts "Some Error, check your inputs:"
26 puts "ruby dir.rb <routes> '<file>'"
27end
28
这里报错的同时告诉了你格式。
最终效果:
评论 (0)