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. iOS学习笔记(十一)——JSON数据解析

    在之前的<iOS学习——xml数据解析(九)>介绍了xml数据解析,这一篇简单介绍一下Json数据解析.JSON 即 JavaScript Object Natation,它是一种轻量级的 ...

  2. 【BZOJ3995】[SDOI2015]道路修建 线段树区间合并

    [BZOJ3995][SDOI2015]道路修建 Description  某国有2N个城市,这2N个城市构成了一个2行N列的方格网.现在该国政府有一个旅游发展计划,这个计划需要选定L.R两列(L&l ...

  3. Kubectl工具常用命令

    创建namesapce kubectl create namespace {name} 注意:name只能为小写字母.数字和-的组合,且开头结尾为字母,一般格式为my-name 123-abc等. 创 ...

  4. set集合可以添加重复元素

    set集合判断元素的唯一性要重写hashcode和equals方法,这样就能保证不会加入重复的元素, 但是在以下这种情况下任然可以加入重复元素,即使他们的hashcode和equals方法结果相同 p ...

  5. 谷歌浏览器input中的text 和 button 水平对齐的问题

    方法一  text 的vertical-align :top; 方法二  button的vertical-align: middle;

  6. js内置数据类型

    JS 中分为七种内置类型,七种内置类型又分为两大类型:基本类型和对象(Object). 基本类型有六种: number , string , boolean , null , undefined ,  ...

  7. Linux中的判断式

    格式一:test [参数] 判断内容格式二:[ [参数] 判断内容 ] 说明: a.格式二可以认为是格式一的缩写 b.格式二里中括号和内容之间要有空格 基于文件的判断-d 判断文件是否存在,并且是目录 ...

  8. 关于android编程中service和activity的区别

    一. 绝大部分情况下,Service的作用是用来“执行”后台的.耗时的.重要的任务,三者缺一不可,而最重要的原因是第三点:要执行重要的任务. 因为当一个进程启动了Service后,进程的优先级变高了, ...

  9. Java基础—运算符(转载)

    转载自:Java运算符 计算机的最基本用途之一就是执行数学运算,作为一门计算机语言,Java也提供了一套丰富的运算符来操纵变量.我们可以把运算符分成以下几组: 算术运算符 关系运算符 位运算符 逻辑运 ...

  10. Scrapy框架2

    一.进程.线程.协成 1.进程.线程.协成之间的关系          1.  线程是计算机中最小的工作单元.              2. 进程是提供资源供n个线程使用,即进程是最小的管理单元. ...