人生总是要折腾一下的

python练习_sed替换

python练习_sed替换

需求:

  1. 做一个sed替换小程序,实现在windows下可以与实现linux中sed替换的功能
  2. 支持正则(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         ''')
sed替换

 

运行结果:

下面的意思是 -c 替换 匹配当前目录下sed_test文件中  以大写W开头,接任意数字和字母,且结尾是n的字符替换成 test

 

posted @ 2017-01-20 10:37  北京-小远  阅读(2196)  评论(0编辑  收藏  举报