前段時間寫了個 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
刪除多文件直接目錄就行 ./*