LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1222|回复: 4

有关sed中的正则表达式

[复制链接]
发表于 2009-6-4 15:03:51 | 显示全部楼层 |阅读模式
sed -e 's/\"\\([^\"]*\\)\"/\\1/'
sed -e 's/^[^A-Z_]*[A-Z_]*[^0-9]*\([0-9]*\) *$/\1/g'

以上两句小弟看的不是很明白,但大致知道下面一句能够提取一行中的数字段. 具体能不能轻哪位兄弟解释一下.感谢.
发表于 2009-6-5 01:05:48 | 显示全部楼层
sed -e 's/\"\\([^\"]*\\)\"/\\1/'

\" -- 匹配字符 "
\\ -- 匹配字符 \
[^\"]* -- 匹配非\*字符0-n个

所以,第一个表达式匹配这样的字符串,这个字符串以"\(开头,中间包含0-n个非\或者"的字符,然后后边是\)"。比如"\(orilla\)",然后将其替换为\1。实例:
  1. he-bash-3.2$ cat 1
  2. "\(orilla\)"
  3. orilla\\\)))***
  4. he-bash-3.2$ sed -e 's/"\\([^"]*\\)"/\\1/' 1
  5. \1
  6. orilla\\\)))***
复制代码


第二个没有什么问题,匹配以0个或者n个非大写字母和下划线开头,紧接着包含0个或者n个下划线或者大写字母,接下来是0个或者n个非数字字符,然后是以0个或者n个数字或者空格结尾的行。实例:
  1. he-bash-3.2$ cat 1
  2. orilla9527
  3. Orilla9527
  4. OrillA9527
  5. he-bash-3.2$ sed -e 's/^[^A-Z_]*[A-Z_]*[^0-9]*\([0-9]*\) *$/\1/g' 1
  6. 9527
  7. 9527
  8. he-bash-3.2$ sed -e 's/^[^A-Z_]*[A-Z_]*[^0-9]*\([0-9]*\) *$/22\1/g' 1
  9. 22
  10. 229527
  11. 229527
  12. 22
复制代码
注意这个正则对于任意的行是始终有匹配的,不管这一行的内容是什么,但是不一定可以捕获数据,所以这个写法我觉得不是很好。
回复 支持 反对

使用道具 举报

发表于 2009-6-5 01:23:52 | 显示全部楼层
为什么代码最后会多出来两行空行,我明明把[/code]放到紧挨着代码的地方了。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-6-7 11:53:55 | 显示全部楼层
Post by orilla;1994272
sed -e 's/\"\\([^\"]*\\)\"/\\1/'

\" -- 匹配字符 "
\\ -- 匹配字符 \
[^\"]* -- 匹配非\*字符0-n个

所以,第一个表达式匹配这样的字符串,这个字符串以"\(开头,中间包含0-n个非\或者"的字符,然后后边是\)"。比如"\(orilla\)",然后将其替换为\1。实例:
  1. he-bash-3.2$ cat 1
  2. "\(orilla\)"
  3. orilla\\\)))***
  4. he-bash-3.2$ sed -e 's/"\\([^"]*\\)"/\\1/' 1
  5. \1
  6. orilla\\\)))***
复制代码



第二个没有什么问题,匹配以0个或者n个非大写字母和下划线开头,紧接着包含0个或者n个下划线或者大写字母,接下来是0个或者n个非数字字符,然后是以0个或者n个数字或者空格结尾的行。实例:
  1. he-bash-3.2$ cat 1
  2. orilla9527
  3. Orilla9527
  4. OrillA9527

  5. he-bash-3.2$ sed -e 's/^[^A-Z_]*[A-Z_]*[^0-9]*\([0-9]*\) *$/\1/g' 1

  6. 9527
  7. 9527

  8. he-bash-3.2$ sed -e 's/^[^A-Z_]*[A-Z_]*[^0-9]*\([0-9]*\) *$/22\1/g' 1
  9. 22
  10. 229527
  11. 229527
  12. 22
复制代码

注意这个正则对于任意的行是始终有匹配的,不管这一行的内容是什么,但是不一定可以捕获数据,所以这个写法我觉得不是很好。


多谢回复,有两点关于第一行代码的,我觉得\"前的\是转义字符,\\(和\\)组成有其他的意思吧? 不知道我这样想对不对
回复 支持 反对

使用道具 举报

发表于 2009-6-7 13:55:05 | 显示全部楼层
\"是转义"的,\\转义了\。所以后边的(只能当作普通字符处理。
所以这个字符串"\(orilla\)"才可以被匹配。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表