需求:html
如下代碼實現的功能與思路:python
功能: linux
(1)支持文件內容的替換和刪除 -c 替換 -d刪除
(2)經過re模塊支持命令行輸入正則,從而處理文件內容(支持python中正則模式,方法請點擊這裏)
(3)使用讀取替換寫入臨時文件的方式進行內容處理,默認生成的臨時文件是 [.被替換文件],這樣在linux中爲隱藏文件,windows下調用本地命令將臨時文件增長隱藏屬性
(4)替換過的內容和行數,都有有效的輸出小程序
思路:windows
一、sed替換功能實現首先要獲取命令行執行腳本可以獲取到傳入的參數(sys.argv能夠獲取命令行傳入的參數)ide
二、要可以讀取源文件,按照行進行替換的匹配,而後保存到內存或者臨時文件中,以後從新寫入或者更更名稱(os.remove能夠刪除源文件os.rename能夠更改文件名)函數
三、要支持正則須要在按行匹配的時候使用用戶輸入的正則進行匹配,匹配出要被替換的內容,而後進行替換便可url
流程圖:spa
使用方法:
命令行
執行環境: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