CodeSky 代码之空

随手记录自己的学习过程

Ruby 正则小脚本处理空行

2015-08-26 17:57分类: Ruby评论: 0

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

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

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

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

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

在这里出现了个变量filefile需要我们去读取\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)