ที่มาจริง ๆ แล้ว ต้องการค้นหาและแทนที่เอกสารในไฟล์ .doc จึงสั่งด้วยคำสั่งว่า
$ sed -i 's/OLD/NEW/g' *.doc
ไม่ได้ผล นึกว่ารหัสเอกสารผิด เลยเป็นที่มาของสคริปต์อันนี้ คือค้นหาและแทนที่เอกสารทั้ง utf-8 และ tis-620 โดยไม่สนใจว่าเป็นเอกสารชนิดใด
(สุดท้ายปรากฎว่าไม่ได้ผล เพราะ OpenOffice ไม่ได้เก็บไว้ในรูป Text file ปกติ
ถึงจะโง่ไปแล้ว แต่บันทึกไว้หน่อยดีกว่า เผื่อได้ใช้ทีหลัง)
$ vi sed_i.py
#!/usr/bin/env python
# -*- coding: utf8 -*-
"""Replace thai string in file"""
import sys, os
def usage(prog):
print 'Usage: %s "old" "new" filename' % (prog)
def cannotopenfile(filename):
print "Cannot open file %s" % (filename)
def getbakfilename(filename="", ext="bak"):
if filename == "":
return ""
if os.path.exists(filename + "." + ext):
i = 0
while os.path.exists(filename + "." + ext + str(i)) and (i < 1000):
i += 1
if i > 999:
return ""
return filename + "." + ext + str(i)
else:
return filename + "." + ext
#
def main(old,new,filename):
if not os.path.exists(filename):
cannotopenfile(filename)
sys.exit(0)
ismod = False
newdoc = []
f = open(filename)
for line in f:
newline1 = line.replace(old, new)
newline2 = line.replace(old.decode('utf8').encode('tis620'), new.decode('utf8').encode('tis620'))
if not ismod and (newline1 != line or newline2 != line):
ismod = True
if newline1 != line:
newdoc.append(newline1)
else:
newdoc.append(newline2)
f.close()
if ismod:
bakfile = getbakfilename(filename)
os.rename(filename, bakfile)
f = open(filename, "w")
f.write('\n'.join(newdoc))
f.close()
print "%s changed, save backup in %s." % (filename, bakfile)
else:
print "Pattern not found, no changed."
if __name__ == "__main__":
if len(sys.argv) < 4:
usage(sys.argv[0])
sys.exit[0]
else:
main(*sys.argv[1:4])
ใช้งานด้วยคำสั่ง
$ ./sed_i.py "OLD" "NEW" filename
ถ้าเจอ จะแทนที่ และบันทึกไว้ในชื่อเดิม แต่สำรองไฟล์ไว้ด้วย ในชื่อ filename.bak