python练习_sed替换
python练习_sed替换
需求:
- 做一个sed替换小程序,实现在windows下可以与实现linux中sed替换的功能
- 支持正则(re模块)
以下代码实现的功能与思路:
功能:
(1)支持文件内容的替换和删除 -c 替换 -d删除
(2)通过re模块支持命令行输入正则,从而处理文件内容(支持python中正则模式,方法请点击这里)
(3)使用读取替换写入临时文件的方式进行内容处理,默认生成的临时文件是 [.被替换文件],这样在linux中为隐藏文件,windows下调用本地命令将临时文件增加隐藏属性
(4)替换过的内容和行数,都有有效的输出
思路:
1、sed替换功能实现首先要获取命令行执行脚本能够获取到传入的参数(sys.argv可以获取命令行传入的参数)
2、要能够读取源文件,按照行进行替换的匹配,然后保存到内存或者临时文件中,之后重新写入或者更改名称(os.remove可以删除源文件os.rename可以更改文件名)
3、要支持正则需要在按行匹配的时候使用用户输入的正则进行匹配,匹配出要被替换的内容,然后进行替换即可
流程图:
使用方法:
执行环境:Python3.5版本
python sed_main [-c|d] [str] [new str] [file url]
[-c|d]:-c 替换 -d 删除 删除不需要添加new str
[str] :要替换或删除的字符,支持正则
[new str]:要被替换成什么字符,-d参数不需要填写
[file urt]:要被替换文件的路径,相对和觉对都可以
代码:
1 #!/usr/bin/env python 2 # -*- coding: utf-8 -*- 3 4 import re 5 import os 6 import sys 7 import platform 8 9 line = 0 10 userin = sys.argv 11 12 class File_sed(object): 13 def __init__(self,sed_list): 14 ''' 15 self.line 计时器记住更改的行数regular()函数调用 16 self.sed_list 获得命令行传入的参数 17 ''' 18 self.sed_list = sed_list 19 self.line = 0 20 21 def file_handling(self,): 22 if os.path.isfile(self.sed_list[-1]): 23 if "\\" in self.sed_list[-1]: 24 newfile_url = self.new_file_dispose(self.sed_list[-1],"\\") 25 elif "/" in self.sed_list[-1]: 26 newfile_url = self.new_file_dispose(self.sed_list[-1],"/") 27 else: 28 newfile_url = "" 29 print("Error:New files are generated to fail") 30 exit() 31 s = open(newfile_url,"a+") #创建文件用好设置隐藏属性 32 s.close() 33 if "indows" in platform.platform(): 34 os.system("attrib +h -s %s"%newfile_url) 35 with open(self.sed_list[-1],encoding="utf-8") as original_file,open(newfile_url,"a+",encoding="utf-8") as new_file: 36 for i in original_file.readlines(): 37 new_content = self.regular(i) 38 new_file.write(new_content) 39 os.remove(self.sed_list[-1]) 40 os.rename(newfile_url,self.sed_list[-1]) 41 if "indows" in platform.platform(): 42 os.system("attrib -h %s"%self.sed_list[-1]) 43 else: 44 print("文件不存在") 45 46 def new_file_dispose(self,original_url,separator): 47 ''' 48 生成临时文件的文件名和路径 49 ''' 50 new_url = original_url.split(separator) 51 new_file_name = '.'+original_url.split(separator)[-1] 52 new_url[-1] = new_file_name 53 new_name_url = separator.join(new_url) 54 return new_name_url 55 56 def regular(self,file_content): 57 ''' 58 正则匹配跟字符串替换 59 ''' 60 self.line+=1 61 new_str_in = re.findall(self.sed_list[2],file_content) 62 if len(new_str_in): 63 for matching_str in new_str_in: 64 if self.sed_list[1] == "-c": 65 file_content = file_content.replace(matching_str,self.sed_list[3]) 66 print("已经替换地%s行的[ %s ]"%(self.line,matching_str)) 67 elif self.sed_list[1] == "-d": 68 file_content = file_content.replace(matching_str,"") 69 print("已经删除地%s行的[ %s ]"%(self.line,matching_str)) 70 else: 71 pass 72 return file_content 73 74 if __name__ == "__main__": 75 #用于判断用户输入的参数是否正确的,通过sys.argv收集用户输入,通过参数调用不同的功能 76 if len(userin) == 1: 77 print(''' 78 --------------参数------------- 79 help 帮助 80 -c 替换 81 -d 删除 82 支持正则,语法规则参考 Excel 83 ------------------------------- 84 ''') 85 else: 86 if userin[1] == "-c": 87 if len(userin) == 5: 88 file_main = File_sed(userin) 89 file_main.file_handling() 90 else: 91 print("参数错误 sed_main -c str newstr path") 92 elif userin[1] == "-d": 93 if len(userin) == 4: 94 file_main = File_sed(userin) 95 file_main.file_handling() 96 else: 97 print("参数错误 sed_main -d str path") 98 else: 99 print(''' 100 --------------参数------------- 101 help 帮助 102 -c 替换 103 -d 删除 104 支持正则,语法规则参考 Excel 105 ------------------------------- 106 ''')
运行结果:
下面的意思是 -c 替换 匹配当前目录下sed_test文件中 以大写W开头,接任意数字和字母,且结尾是n的字符替换成 test