2009年4月1日

用正则表达式修改代码

需求:将代码目录下所有文件的关于动态数组的返回参数修改为如下的形式:
原文: struct abc *var[],
替换: struct abc **var,

我用如下的脚本实现的这个功能,主要用到了find、sed 和正则表达式

1.查找
正则表达式:\s\*\s*\([a-zA-Z0-9_]*\)\[\]
这个正则表达式并不是十分的准确,只是在这个需求下工作的还行。
说明:
\s 匹配任意空白字符
\* 匹配一个*号
[a-zA-Z0-9_]* 匹配函数名(这个是不太准确的)
\[\] 匹配[]
\(xxxx\) 匹配xxxx并命名,使得xxxx部分能够被引用(xxxx为正则表达式)

2.替换
表达式:" **\1" (前面是个空格)
说明:
\1 引用正则表达式中的\(xxxx\)部分

3.sed
sed -e 's/old/new/g' < $OldFile > $NewFIle
说明:
将OldFile文件中的old串替换为new串,写入NewFile文件中

4.find
find $DIR -type f -name '*.[ch]'
说明:
查找DIR目录下的所有源文件(.c .h)文件 忽略目录、二进制文件、CVS文件、Makefile等文件

下面是脚本的内容:

_____________________这是分割线___________________
#!/bin/sh
# Desciption:

# Replace: struct abc *var[],
# to : struct abc **var,
#
# Written by Zhao Wenlu, 2009-03-30

# Source Directory
DIR=$1

# All source files
FILES=$(find $DIR -type f -name '*.[ch]')

# process each file
for FILE in $FILES;
do
# Replace: struct abc *var[],
# to : struct abc **var,

sed -e 's/\s\*\s*\([a-zA-Z0-9_]*\)\[\]/ **\1/g' < $FILE > $FILE.replace

# move replaced file to temp directory
mkdir -p $(dirname tmp/$FILE)
mv $FILE.replace tmp/$FILE
done

# rename temp to final directory
mv tmp/$DIR $DIR-replace

# have a cup of coffee!
exit 0

_____________________这是分割线___________________


PS: 请问怎么把代码高亮搞的更好看一些?

没有评论: