这是@Ashwini Chaudhary 的答案的 Python 3 变体,用于pattern
从 give中删除所有包含正则表达式的行filename
:
#!/usr/bin/env python3
"""Usage: remove-pattern <pattern> <file>"""
import fileinput
import re
import sys
def main():
pattern, filename = sys.argv[1:] # get pattern, filename from command-line
matched = re.compile(pattern).search
with fileinput.FileInput(filename, inplace=1, backup='.bak') as file:
for line in file:
if not matched(line): # save lines that do not match
print(line, end='') # this goes to filename due to inplace=1
main()
它假设locale.getpreferredencoding(False) == input_file_encoding
否则它可能会在非 ascii 字符上中断。
无论当前的语言环境是什么或具有不同编码的输入文件,都要使其工作:
#!/usr/bin/env python3
import os
import re
import sys
from tempfile import NamedTemporaryFile
def main():
encoding = 'utf-8'
pattern, filename = sys.argv[1:]
matched = re.compile(pattern).search
with open(filename, encoding=encoding) as input_file:
with NamedTemporaryFile(mode='w', encoding=encoding,
dir=os.path.dirname(filename),
delete=False) as outfile:
for line in input_file:
if not matched(line):
print(line, end='', file=outfile)
os.replace(outfile.name, input_file.name)
main()