版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
前段时间写了个 py 脚本,替换目录中所有文件中的字符串,但是会出现问题,如果用短字符串替换长字符串就会出现最后出现一些原有文件的遗留,原来文件内容不会清除,而是以覆盖的形式替换,查了下有 truncate(size)
函数,用以从首字节开始截断 size 大小(默认截断所有),就解决了。
#!/usr/bin/env python3
import os
import sys
import argparse
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument("file_directory", help="the directory contain files you want replace", default="")
parser.add_argument("source_str", help="the source string you want replace", default="")
parser.add_argument("destination_str", help="the destination string you want replace to", default="")
args = parser.parse_args()
file_dir = args.file_directory
files = os.listdir(file_dir)
for per_file in files:
file_path = file_dir + "/" + per_file
f = open(file_path, 'r+')
s = f.read()
f.seek(0, 0)
f.truncate()
f.write(s.replace(args.source_str, args.destination_str))
f.close()
然后还不如 linux sed 命令来的方便:
grep -rl "Source string" . | xargs -n1 sed -i "s/Source string/Destination string/g"
读写模式主要有以下:
访问模式 | 意义 |
---|---|
r | 读 |
w | 覆盖写,文件不存在会进行创建。 |
a | 附加写,文件不存在会进行创建。 |
r+ | 读 + 写。 |
w+ | 读 + 写,文件不存在会进行创建。 |
a+ | 读 + 附加写,文件不存在会进行创建。 |
多了 “b”,就是用来表示二进制读写
sed 命令
替换:s
全局:g
全局替换:替换文件中所有包含 source 为 target :
sed -i 's/source/target/g' file.txt
删除文件中包含 source 的行:
sed -i '/source/d' file.txt
删除多文件直接目录就行 ./*