LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
楼主: 弥敦路九号

从开始到ABC(不含)结束,如何用正则表达式描述

[复制链接]
发表于 2005-4-15 02:52:35 | 显示全部楼层
[PHP]
:let end=line(".")
:let num=1
:1
:while num<=end
:let line=getline(".")
:let temp1=matchstr(line,"ABC.*$")
:let temp=substitute(line,"^.*ABC.*",temp1,"")
:call setline(".",temp)
:+
:let num=num+1
:endwhile[/PHP]
回复 支持 反对

使用道具 举报

发表于 2005-4-15 11:22:10 | 显示全部楼层
Post by zhy2111314
  1. zhyfly@zhyfly:~/bash$ cat 1
  2. xasdfasfABC...
  3. 2132ABC...
  4. xxxxABC...
  5. zhyfly@zhyfly:~/bash$ sed -e 's/^[^A]*A/A/g' 1
  6. ABC...
  7. ABC...
  8. ABC...
  9. zhyfly@zhyfly:~/bash$
复制代码

/^[^A]*A/A/
也就是说相当于把 开头不是A到A的字符段 用 A 替换!


如果列子是这样的话,似乎就不对了
------------------------
AxasdfasfABC...
21AC32ABC...
ABxxxxABC...
------------------------
出来的结果就是
------------------------
AxasdfasfABC...
AC32ABC...
ABxxxxABC...
------------------------

如果不管ABC这个词在行中出现几次,结果都是要最后一个ABC和后面的,那么按照Regex的贪婪原则,只要%s/.*A/A就行了。(这样就不会受到单独的A,B,C或组合的干扰了)。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-4-15 13:45:21 | 显示全部楼层
看来正则表达式本身是无法描述那部分了,大家的方法也基本上是用其它方式 转换操作.
OK, thanks a lot
回复 支持 反对

使用道具 举报

发表于 2005-4-15 23:52:03 | 显示全部楼层
Post by yongjian
如果列子是这样的话,似乎就不对了
------------------------
AxasdfasfABC...
21AC32ABC...
ABxxxxABC...
------------------------
出来的结果就是
------------------------
AxasdfasfABC...
AC32ABC...
ABxxxxABC...
------------------------

如果不管ABC这个词在行中出现几次,结果都是要最后一个ABC和后面的,那么按照Regex的贪婪原则,只要%s/.*A/A就行了。(这样就不会受到单独的A,B,C或组合的干扰了)。

不错!
贪婪原则头一次听说! :thank
回复 支持 反对

使用道具 举报

发表于 2005-4-18 12:09:09 | 显示全部楼层
我用的是
s/\(.*\)\(ABC.*\)/\2
应该可以

将文本分为两部分,然后整体用第二部分代替
回复 支持 反对

使用道具 举报

发表于 2005-4-18 12:10:50 | 显示全部楼层
那还不如s/^.*\(ABC.*\)/\1/g吧。
回复 支持 反对

使用道具 举报

发表于 2005-4-18 12:56:40 | 显示全部楼层
大家看清楚

楼主要的是,只用正则表达式描述,不用s,\(\)之类的来保存或处理

我觉得单单靠正则表达式描述,非常的困难
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-4-18 13:32:40 | 显示全部楼层
嗯.解决的方法可能比较多,但用RE描述可能难了点.
回复 支持 反对

使用道具 举报

发表于 2005-4-18 20:26:02 | 显示全部楼层
sed 's/^\(.*\)\(ABC.*\{1,\}\)/\1/'  URFILE 不就行了,不过要单纯描述出那部分好像比较难
回复 支持 反对

使用道具 举报

发表于 2005-4-20 03:11:15 | 显示全部楼层
Post by zhy2111314
不错!
贪婪原则头一次听说! :thank


是的, Regex是非常贪婪的,它会尽可能地匹配最长的内容。
回复 支持 反对

使用道具 举报

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

本版积分规则

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