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]:要被替换文件的路径,相对和觉对都可以

代码:

 #!/usr/bin/env python
# -*- coding: utf-8 -*- import re
import os
import sys
import platform line = 0
userin = sys.argv class File_sed(object):
def __init__(self,sed_list):
'''
self.line 计时器记住更改的行数regular()函数调用
self.sed_list 获得命令行传入的参数
'''
self.sed_list = sed_list
self.line = 0 def file_handling(self,):
if os.path.isfile(self.sed_list[-1]):
if "\\" in self.sed_list[-1]:
newfile_url = self.new_file_dispose(self.sed_list[-1],"\\")
elif "/" in self.sed_list[-1]:
newfile_url = self.new_file_dispose(self.sed_list[-1],"/")
else:
newfile_url = ""
print("Error:New files are generated to fail")
exit()
s = open(newfile_url,"a+") #创建文件用好设置隐藏属性
s.close()
if "indows" in platform.platform():
os.system("attrib +h -s %s"%newfile_url)
with open(self.sed_list[-1],encoding="utf-8") as original_file,open(newfile_url,"a+",encoding="utf-8") as new_file:
for i in original_file.readlines():
new_content = self.regular(i)
new_file.write(new_content)
os.remove(self.sed_list[-1])
os.rename(newfile_url,self.sed_list[-1])
if "indows" in platform.platform():
os.system("attrib -h %s"%self.sed_list[-1])
else:
print("文件不存在") def new_file_dispose(self,original_url,separator):
'''
生成临时文件的文件名和路径
'''
new_url = original_url.split(separator)
new_file_name = '.'+original_url.split(separator)[-1]
new_url[-1] = new_file_name
new_name_url = separator.join(new_url)
return new_name_url def regular(self,file_content):
'''
正则匹配跟字符串替换
'''
self.line+=1
new_str_in = re.findall(self.sed_list[2],file_content)
if len(new_str_in):
for matching_str in new_str_in:
if self.sed_list[1] == "-c":
file_content = file_content.replace(matching_str,self.sed_list[3])
print("已经替换地%s行的[ %s ]"%(self.line,matching_str))
elif self.sed_list[1] == "-d":
file_content = file_content.replace(matching_str,"")
print("已经删除地%s行的[ %s ]"%(self.line,matching_str))
else:
pass
return file_content if __name__ == "__main__":
#用于判断用户输入的参数是否正确的,通过sys.argv收集用户输入,通过参数调用不同的功能
if len(userin) == 1:
print('''
--------------参数-------------
help 帮助
-c 替换
-d 删除
支持正则,语法规则参考 Excel
-------------------------------
''')
else:
if userin[1] == "-c":
if len(userin) == 5:
file_main = File_sed(userin)
file_main.file_handling()
else:
print("参数错误 sed_main -c str newstr path")
elif userin[1] == "-d":
if len(userin) == 4:
file_main = File_sed(userin)
file_main.file_handling()
else:
print("参数错误 sed_main -d str path")
else:
print('''
--------------参数-------------
help 帮助
-c 替换
-d 删除
支持正则,语法规则参考 Excel
-------------------------------
''')

sed替换

运行结果:

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

python练习_sed替换的更多相关文章

  1. python字符串内容替换的方法(转载)

    python字符串内容替换的方法 时间:2016-03-10 06:30:46来源:网络 导读:python字符串内容替换的方法,包括单个字符替换,使用re正则匹配进行字符串模式查找与替换的方法.   ...

  2. Linux下Python 文件内容替换脚本

    Linux下Python 文件替换脚本 import sys,os if len(sys.argv)<=4: old_text,new_text = sys.argv[1],sys.argv[2 ...

  3. python file模块 替换输入内容脚本

    root@python-10:/home/liujianzuo/python/test# ls passwd rc.local test1 root@python-10:/home/liujianzu ...

  4. Python - 字符串的替换(interpolation) 具体解释

    字符串的插值(interpolation) 具体解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/27054263 字符串的替换 ...

  5. python 之 批量替换文件中文本后缀

    代码示例如下: #!/usr/local/bin python import os def swapextensions(dir, before, after): if before[:1] != ' ...

  6. Python爬虫通过替换http request header来欺骗浏览器实现登录

    以豆瓣为例,访问https://www.douban.com/contacts/list 来查看自己关注的人,要登录才能查看. 如果用requests.get()方法获取这个http,没登录只能抓取回 ...

  7. python基于函数替换的热更新原理介绍

    热更新即在不重启进程或者不离开Python interpreter的情况下使得被编辑之后的python源码能够直接生效并按照预期被执行新代码.平常开发中,热更能极大提高程序开发和调试的效率,在修复线上 ...

  8. 【算法编程 C++ Python】字符串替换

    题目描述 请实现一个函数,将一个字符串中的空格替换成“%20”.例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy.   C++使用string,pyt ...

  9. Python补充4——替换与修改

    最近在自学Python ,在学习过程中发现一个问题,就是Python 的替换与修改. 按照中文思维,替换与修改有什么区别吗?如果发生了部分替换不就是修改了吗?如果修改了不就是新对象替换了老对象吗? 实 ...

随机推荐

  1. Uvalive6885(最短路)

    题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=129723 题目大意:n个点,m条边,求出从0到n的最短距离,输出途 ...

  2. Spring3.2.11与Quartz2.2.1整合时内存泄漏的问题的解决

    Quartz是一款定时任务调度的开源框架,使用起来比较方便.并且Spring的support包对Quartz有集成.但是笔者在web应用使用的过程中却遇到了内存泄漏的问题. 问题的产生 笔者在使用Sp ...

  3. 巨蟒python全栈开发django13:中间件部分

    1.回顾昨日内容 2.session认证装饰器 3.django整个流程 4.中间件简单应用 5.简单统计访问次数 6.中间件其他方法 7.orm单表内容回顾

  4. es字符串字段类型的私有属性 建立索引的分析器 用于查询的分析器 短语查询优化

    除了公共属性外,基于字符串的字段还有私有属性 term_vector  是否计算该字段的Lucene词向量term vector no  默认值 yes with_offsets with_posit ...

  5. 理解spring中的BeanFactory和FactoryBean的区别与联系

    原文地址:http://blog.csdn.net/joenqc/article/details/66479154 首先,这俩都是个接口… 实现 BeanFactory 接口的类表明此类事一个工厂,作 ...

  6. Eclipse解决JSP页面乱码问题

    解决方案 1.首先选择 Window  -->  Preferences  -->  General-->  Content Types --> text (点击左边的+,显示 ...

  7. 2.5 使用ARDUINO做主控,手机发送短信控制开关LED

    需要准备的硬件 MC20开发板 1个 https://item.taobao.com/item.htm?id=562661881042 GSM/GPRS天线 1根 https://item.taoba ...

  8. Python之异常处理(Day27)

    一.错误和异常 part1: 1.语法错误(这种错误,根本过不了python解释器的语法检测,必须在程序执行前就改正) #语法错误示范一 if #语法错误示范二 def test: pass #语法错 ...

  9. python数据之间的转换和关系

    首先数据类型在我看来分为两类: 容器类:能存储数据,例如:元祖.列表.集合.字符串. 原子类:单纯保存数值,例如:整数.浮点数.复数. 容器类与容器类之间,一般都可以进行两两之间的转化. 原子类与原子 ...

  10. Ubuntu输入su命令提示认证失败的解决办法

    Ubuntu安装后,root用户默认是被锁定了的,不允许登录,也不允许执行"su命令到root".对于桌面用户而言,这样可以提高安全性.但对于服务器可以设置成允许"su命 ...