IT技术博客大学习 共学习 共进步

学习Grep,Sed中的正则

火丁笔记 2010-10-31 20:27:05 浏览 5,264 次

据说有这么一个段子:

毛泽东说:三天不学习,赶不上刘少奇。
刘少奇说:一天不用功,赶不上毛泽东。

到底是老百姓作的打油诗,还是政客对的对联,早已无从考证。

STOP!回到主题上来,正则是必须时常温习的知识,下面学习Grep,Sed中的正则。

问题:从一个文本文件里筛选出含有电话号码的行,电话号码是由七位或者八位阿拉伯数字组成(开头不是零),并且被单引号或者双引号包裹。

鉴于问题的需要,先杜撰一份数据:

# cat /path/to/data.txt
'7654321'
'7654321"
"87654321"
"87654321'

失败的尝试

# grep "(['\"])[1-9][0-9]{6,7}\1" /path/to/data.txt
grep: Invalid back reference
# sed -n "/(['\"])[1-9][0-9]{6,7}\1/p" /path/to/data.txt
sed: -e expression #1, char 25: Invalid back reference

成功的尝试

使用Basic Regular Expressions (BRE)

# grep "\(['\"]\)[1-9][0-9]\{6,7\}\1" /path/to/data.txt
'7654321'
"87654321"
# sed -n "/\(['\"]\)[1-9][0-9]\{6,7\}\1/p" /path/to/data.txt
'7654321'
"87654321"

使用Extended Regular Expressions (ERE)

# grep -E "(['\"])[1-9][0-9]{6,7}\1" /path/to/data.txt
'7654321'
"87654321"
# sed -n -r "/(['\"])[1-9][0-9]{6,7}\1/p" /path/to/data.txt
'7654321'
"87654321"

总结,Grep和Sed同时支持BRE和ERE两种正则,缺省情况下,Grep和Sed使用的都是BRE正则,通过增加命令参数(grep -E / sed -r),Grep和Sed可以支持ERE正则。

BTW:Regular expression From Wikipedia, the free encyclopedia

建议继续学习

  1. 利用find和sed批量替换文件内容 (阅读 11,346)
  2. Linux grep命令用法 (阅读 6,960)
  3. grep 正则表达式选项要记得转义 (阅读 6,442)
  4. 统计最近用过的linux命令 (阅读 6,402)
  5. 正则表达式基础 (阅读 6,160)
  6. 正则表达式的与或非 (阅读 5,741)
  7. SED命令行脚本快速参考,AWK命令行脚本快速参考,perl命令行脚本快速参考 (阅读 4,742)
  8. URL正则表达式 (阅读 4,660)
  9. 正则表达式简要入门 (阅读 4,362)
  10. 正则转义符汇总 (阅读 4,320)