• 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

  • 相关阅读:
    一个在LINUX里安装MS LIB的工具
    Debian 5网易更新源
    ZT:apache转发实现iis和apache共享80端口
    SuSE 安装 永中Office
    [ZT]用dd备份主引导记录
    opensuse 11.3使用fcitx的办法
    在debian5上安装vmware server 2.0.2的尝试
    VHCS wait to be added问题解决
    debian里的NAT转发设置
    Linux操作系统下安装USB移动硬盘的方法
  • 原文地址:https://www.cnblogs.com/bj-xy/p/6322102.html
Copyright © 2020-2023  润新知