LinuxSir.cn,穿越时空的Linuxsir!

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

初学者请教一个sed问题,谢谢!

[复制链接]
发表于 2004-5-25 22:07:02 | 显示全部楼层 |阅读模式
看代码的时候,遇到下边一句,

sed 's/ *\(\{6,\}\)n/\1 /'

我查阅了sed手册,还看正则表达式的一些用法,但还是不理解这句话什么含义,请高手指点一下,怎么分析这个代码呢?
谢谢!!
发表于 2004-5-25 22:49:41 | 显示全部楼层
实践一下

  1. [code]
  2. /home/lee#echo "        ddddddddddn     a"
  3.         ddddddddddn     a
  4. /home/lee#echo "        ddddddddddn     a"|sed 's/ *\([a-z]\{6,\}\)n/\1 /'
  5. dddddddddd      a
  6. /home/lee#
复制代码

前面任意个空格,后跟连续6个或至少6个以上的字符后面跟字母n这样的模式
删除前面的任意个空格和字母n
 楼主| 发表于 2004-5-26 08:29:59 | 显示全部楼层
首先谢谢你的回答!
但是我还有一些疑问,
1。原代码中是sed 's/ *\(\{6,\}\)n/\1 /' ,为什么你改成了sed 's/ *\([a-z]\{6,\}\)n/\1 /',是不是等效的?
2。sed 's/regexp/replacement/' 不是用来替换的吗?这个语句不是这种结构吗?
3.\1代表什么呢?
还请版主不吝赐教!洗耳恭听! 谢谢!
:)
发表于 2004-5-26 09:38:27 | 显示全部楼层
sed中可以有保留字串, 在\(和\)中的regex将成为保留字串,在replacement中, 可以以\1, \2, \3...等来表示. 1,2,3的顺序根据前面出现的保留符号来定, 比如:
\(^[a-z]\)\(.*\)\([0-9]$\).这个表达式match这样一些string:以字母开头, 中间不管, 以数字结尾, 同时\(和\)将这个string分成了三部分,这样你就可以只修改你需要的部分而将不需要修改的部分保留起来.如:
s/\(^[a-z]\)\(.*\)\([0-9]$\)/\1\2" "/表示将第一部分和第二部分保留,将第三部分改成一个空格. 不知是否解释清楚了,请楼主和javalee兄指正.
 楼主| 发表于 2004-5-26 14:01:36 | 显示全部楼层
s/regexp/replacement/                                                   
              Attempt  to match regexp against the pattern space.  If successful,  replace  that  portion  matched  with  replacement.    The replacement may contain the special character & to refer to that portion of the pattern space  which  matched,  and  the  special escapes  \1  through  \9  to refer to the corresponding matching sub-expressions in the regexp.  

谢谢楼上的精彩解答,都怪自己英语不好,不然上面这段话写得很清楚的,看来还得啃英语鸭。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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