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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM