Grep/Sed的扩展正则表达式开关,以及利用正则表达式中的分组功能
2011-01-03 11:13
579 查看
比如把代码里面所有的close调用,替换成alpclose。于是写了一个脚本,有了一些收获。脚本如下:
#!/bin/bash
case "$#" in
0)
echo "Usage: ./grepclose.sh <path>"
exit ;;
1)
echo "Got path: $1, start working..." ;;
*)
echo "Too many arguments. Usage: ./grepclose.sh <path>"
exit ;;
esac
for srcfile in $(find "$1" -name "*.[hc]")
do
grep -E -e "[ =({;?:\t]+close[ \t]*\(" -e "^close[ \t]*\(" "$srcfile" >& /dev/null
if [ $? -eq 0 ]; then
echo "Patching file $srcfile"
cp "$srcfile" "${srcfile}.fdorig"
sed -i "s/^close[ \t]*(/alpclose(/g" "$srcfile"
sed -i -r "s@([ =({;?:\t]+)close[ \t]*\(@\1alpclose\(@g" "$srcfile"
fi
done
1. 使用grep -E来打开grep的扩展正则表达式的功能。所谓扩展,就是像+, ()这样的元字符才能使用。sed使用-r来打开扩展正则表达式。打开了扩展之后,如果要表示一个常量的+, (),就需要用\来转义了。
2. grep -e可以用来表示多个匹配pattern
3. 最后一句sed的时候,使用了正则表达式中的分组功能,也就是将[ =({;?:\t]+这个部分定义成一个组,然后在后面就可以用\1来引用(注意\0已经被默认分配成整个pattern)。如果定义了第二个组,那么就用\2来引用。这个很有用,因为在替换的时候,我们不能把close前面的字符删除,所以要保留close前面匹配到的字符,于是分组就特别好用了。
4. 上述的匹配逻辑是这样的:首先,close顶行头写的,OK;其次,close前面允许有一个或多个空格,等号,小括号,大括号,分号,问号,冒号,tab。其他字符一概不行;最后,close字符串后面允许有0个或者多个空格或tab,然后要有一个小括号。
#!/bin/bash
case "$#" in
0)
echo "Usage: ./grepclose.sh <path>"
exit ;;
1)
echo "Got path: $1, start working..." ;;
*)
echo "Too many arguments. Usage: ./grepclose.sh <path>"
exit ;;
esac
for srcfile in $(find "$1" -name "*.[hc]")
do
grep -E -e "[ =({;?:\t]+close[ \t]*\(" -e "^close[ \t]*\(" "$srcfile" >& /dev/null
if [ $? -eq 0 ]; then
echo "Patching file $srcfile"
cp "$srcfile" "${srcfile}.fdorig"
sed -i "s/^close[ \t]*(/alpclose(/g" "$srcfile"
sed -i -r "s@([ =({;?:\t]+)close[ \t]*\(@\1alpclose\(@g" "$srcfile"
fi
done
1. 使用grep -E来打开grep的扩展正则表达式的功能。所谓扩展,就是像+, ()这样的元字符才能使用。sed使用-r来打开扩展正则表达式。打开了扩展之后,如果要表示一个常量的+, (),就需要用\来转义了。
2. grep -e可以用来表示多个匹配pattern
3. 最后一句sed的时候,使用了正则表达式中的分组功能,也就是将[ =({;?:\t]+这个部分定义成一个组,然后在后面就可以用\1来引用(注意\0已经被默认分配成整个pattern)。如果定义了第二个组,那么就用\2来引用。这个很有用,因为在替换的时候,我们不能把close前面的字符删除,所以要保留close前面匹配到的字符,于是分组就特别好用了。
4. 上述的匹配逻辑是这样的:首先,close顶行头写的,OK;其次,close前面允许有一个或多个空格,等号,小括号,大括号,分号,问号,冒号,tab。其他字符一概不行;最后,close字符串后面允许有0个或者多个空格或tab,然后要有一个小括号。
相关文章推荐
- Grep/Sed的扩展正则表达式开关,以及利用正则表达式中的分组功能
- 【实例】正则表达式利用grep和sed处理日志内容,获取所需的内容
- 正则表达式中grep,sed的用法(包括基本的正则表达式和扩展的正则表达式)
- Linux下正则表达式以及几种工具:grep,sed,awk,cut,sort,uniq的简单应用
- 如何在grep和sed命令中使用扩展的正则表达式
- linux中正则表达式、find、xargs、grep以及sed等命令的用法
- shell脚本之正则表达式、函数、grep、sed、awk、printf等基本命令配置详解
- PHP利用正则表达式实现手机号码中间4位用星号(*)替换显示功能
- (管道| / 重定向> / xargs)/find 与xargs结合使用/vi,grep,sed,awk(支持正则表达式的工具程序)
- grep、sed、awk、perl、js、vim等对正则表达式的支持的差别
- SED,AWK学习笔记Part 1-----利用正则表达式进行文本匹配[转]
- 详解正则表达式以及文本处理工具—grep、egrep的用法和特性
- grep正则表达式及扩展表达式
- Linux基础之-正则表达式(grep,sed,awk)
- grep、egrep以及正则表达式的使用
- [Python]正则表达式(...)分组的扩展示例
- grep在Linux下的神奇定位功能 ----------------- 正则表达式
- 正则表达式RE与扩展正则表达式ERE——grep与egrep
- Linux 正则表达式 vi, grep, sed, awk
- grep、sed、awk、perl、js、vim等对正则表达式的支持的差别