python練習_sed替換

python練習_sed替換

需求:html

  1. 作一個sed替換小程序,實如今windows下能夠與實現linux中sed替換的功能
  2. 支持正則(re模塊)

 

如下代碼實現的功能與思路: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         ''')
sed替換

 

運行結果:

下面的意思是 -c 替換 匹配當前目錄下sed_test文件中  以大寫W開頭,接任意數字和字母,且結尾是n的字符替換成 test

相關文章
相關標籤/搜索