遍历替换文件中的某个关键字

遍历替换文件中的某个关键字

有时遇到一个文件夹下有数百给文件,文件中需要替换某个关键字,或注释行……
手动重复修改很容易出错
这里使用grep/sed/python来简单处理,减轻劳动力

步骤


1. grep 搜索所有的文件,得到需要修改的文件列表,定向到一个文件

如下的例子是搜索#define.*0x80关键字的文件,经过排序,去重,重定向到一个文件中

grep -rl "#define.*0x80" |sort | uniq > sub_file_list

2. sed 尝试匹配修改,得到正确的正则表达式

如下的例子是把关键字define.*0x80替换成define.*0x90
注意这里使用了正则表达式的捕获

echo "#define METAL_ISA_XL64_EXTENSIONS 0x8000000000000000UL" | sed \'s/\(#define.*\)\(0x80\)\(.*\)/\1 0x90\3/g\'

3. 使用python合并上述的步骤,得到修改全部文件的shell脚本

脚本将正确的sed命令和需要修改的文件列表合并到shell脚本中

./substitude_KeyforPerLine.py --demo print
./substitude_KeyforPerLine.py -h

substitude_KeyforPerLine.py

#!/usr/bin/python
# -*- coding: UTF-8 -*- 

import argparse
# Create ArgumentParser() object
parser = argparse.ArgumentParser()
# Add argument
# parser.add_argument('--fl', required=True, help='need modified file list')
parser.add_argument('--fl', help='need modified file list')
parser.add_argument('--demo', help='print grep/sed demo')
parser.add_argument('--cmd', help='a:append new line, s:substitude a word')
# parser.add_argument('--total', type=int, help='number of dataset', default=100)

# Print usage
# parser.print_help()
# Parse argument
args = parser.parse_args()

flist = args.fl

def re_demo():
    print("\n");
    print(r'echo "#define METAL_ISA_XL64_EXTENSIONS 0x8000000000000000UL" | sed \'s/\(#define.*\)\(0x80\)\(.*\)/\1 0x90\3/g\'')
    print(r'grep -rl #define.*0x80 |sort | uniq > sub_file_list'+'\n')

def substitudeAWord():
    read_list_f=open(flist,'r+')
    write_cmd_f=open('modify_line.sh','w')
    for line in read_list_f.readlines():
        print(r"sed -i -e 's/isFixedBank:false/isInterleave:true/g' "+line.strip()) 
        write_cmd_f.write(r"sed -i -e 's/isFixedBank:true/isInterleave:false/g' "+line.strip()+"\n")
    read_list_f.close()
    write_cmd_f.close()

def appendNewLine():
    read_list_f=open(flist,'r+')
    write_cmd_f=open('modify_line.sh','w')
    for line in read_list_f.readlines():
        print(r"sed -i -e '/cubeSkip:/a\        wrapSkip:0,' "+line.strip()) 
        write_cmd_f.write(r"sed -i -e '/cubeSkip:/a\        wrapSkip:0,' "+line.strip()+"\n")
    read_list_f.close()
    write_cmd_f.close()

if(args.demo == "print"):
    re_demo()
if(args.cmd == "s"):
    substitudeAWord()
if(args.cmd == "a"):
    appendNewLine()
posted @ 2019-10-11 12:13  乔_木  阅读(1088)  评论(0编辑  收藏  举报