LinuxSir.cn,穿越时空的Linuxsir!

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

sed 中正则表达式不起作用?已解决

[复制链接]
发表于 2007-12-10 06:41:24 | 显示全部楼层 |阅读模式
在a.txt中,有一行文字,比如“汉字汉字汉字<!-- 正文页画中画 begin -->汉字汉字汉字”

我想将中间的“<!-- 正文页画中画 begin -->”删掉,也就是只留下“汉字汉字汉字汉字汉字汉字”


我用一下sed命令
sed -i 's/<[^<]*>//g' a.txt

结果没有任何变化。也不知到我这个正则表达式的问题出在哪里。请大家帮帮忙。
发表于 2007-12-10 09:15:15 | 显示全部楼层
  1. sed 's/<[^>]\+>//'
复制代码
回复 支持 反对

使用道具 举报

发表于 2007-12-10 12:49:20 | 显示全部楼层
其实楼主的正则表达式虽然可能因为疏忽把[^>]写成了[^<],但还是可以匹配的,sed有一个很大的问题就是,sed的执行会和locale相关。比如说如果文件的编码是gbk的,而locale是utf-8,这时候你所有关于正则表达式的知识都是不起作用的。根据我的经验用sed处理有中文字符处理的文件,最好把locale设置成LC_ALL=C,进行处理,或者你能保证文件的编码和locale是一致的情况下。
回复 支持 反对

使用道具 举报

发表于 2007-12-10 17:29:32 | 显示全部楼层
Post by huan;1793705
  1. sed 's/<[^>]\+>//'
复制代码



可以解释一下了
回复 支持 反对

使用道具 举报

发表于 2007-12-10 17:30:22 | 显示全部楼层
Post by huan;1793705
  1. sed 's/<[^>]\+>//'
复制代码



可以解释一下不  <[^>]\+>
回复 支持 反对

使用道具 举报

发表于 2007-12-10 19:42:15 | 显示全部楼层
Post by huan;1793705
  1. sed 's/<[^>]\+>//'
复制代码

没注意这个正则表达式是无法匹配的,如果sed不加-r参数就是表示使用的基本正则表达式,这时+就是一个普通字符。如果加了-r就表示使用的是扩展的正则表达式,这时s/<[^>]+>//匹配<后面跟1个或者无穷多个不是>的字符,然后跟着一个>,而如果把+换成*,则可以包含0个或者无穷多个,前面加上\就使+失去了特殊的意义,变成了匹配一个+。估计可能是受了在基本正则表达式中{}()都要在前面加上\才能具有扩展正则表达式中的特殊意义的影响,才想当然的加了\。
回复 支持 反对

使用道具 举报

发表于 2007-12-10 20:59:09 | 显示全部楼层
sed和grep均使用基本的正则表达式,egrep和awk才使用扩展的正则表达式,主要的扩展有:+、?、|和()
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-12-11 07:53:13 | 显示全部楼层
Post by ocean390;1793804
其实楼主的正则表达式虽然可能因为疏忽把[^>]写成了[^<],但还是可以匹配的,sed有一个很大的问题就是,sed的执行会和locale相关。比如说如果文件的编码是gbk的,而locale是utf-8,这时候你所有关于正则表达式的知识都是不起作用的。根据我的经验用sed处理有中文字符处理的文件,最好把locale设置成LC_ALL=C,进行处理,或者你能保证文件的编码和locale是一致的情况下。

完全正确。文件的编码是GBK的,我将它转换成utf-8后,搞定了。
多谢楼上各位

另外能否解释一下 LC_ALL=C
回复 支持 反对

使用道具 举报

发表于 2007-12-11 13:02:02 | 显示全部楼层
就是把locale设置成C,如果是bash的话执行一下export LC_ALL=C就可以了,如果是tcsh
就要setenv LC_ALL=C。
回复 支持 反对

使用道具 举报

发表于 2007-12-13 19:13:59 | 显示全部楼层
LC_ALL=C和LANG=en这两个有什么区别
我在实际使用中碰到的是字符显示有问题,然后是用LANG来设置的
我的系统(rhel4u4)上没有LC_ALL变量,系统会从什么地方去默认值
回复 支持 反对

使用道具 举报

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

本版积分规则

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