免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 25417 | 回复: 12
打印 上一主题 下一主题

[文本处理] 关于正则表达式匹配小数点的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-09-05 09:59 |只看该作者 |倒序浏览
使用系统虚拟机centos5.5,kernel 2.6.18

匹配文件如下
$cat record.txt
123 456 789
123.456.789
123456789

我要匹配所有不含小数点的行,使用命令cat record.txt | grep -e "[^.]"  或者 grep -e "[^\.]" 都不行啊,请教一下各位该用什么表达式来匹配。

我现在使用的一些绕过这个匹配的操作:grep -v -e "\." 或者 sed '/\./d' 或者 awk '!/\./{print}'

这些都是使用命令本身的取反操作来绕过正则表达式,但是我还是不知道怎么写正则表达式的“不包含小数点”的式子。

论坛徽章:
0
2 [报告]
发表于 2012-09-05 10:18 |只看该作者
  1. egrep -v "[0-9]+\."
复制代码

论坛徽章:
0
3 [报告]
发表于 2012-09-05 10:20 |只看该作者
grep -v '\.'

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
4 [报告]
发表于 2012-09-05 10:43 |只看该作者
楼上正解

论坛徽章:
0
5 [报告]
发表于 2012-09-05 11:12 |只看该作者
谢谢2、3楼的朋友,不过并没有解决我的问题。

我的问题是“如何用正则表达式匹配所有不含小数点的行”,那个文件是我举得例子。

文中提到了用grep -v或者 sed '/regexp/d'来绕过这个问题,不过还是没解决问题本身。

论坛徽章:
0
6 [报告]
发表于 2012-09-05 14:06 |只看该作者
grep 有个-x选项不知道是不是你想要的

论坛徽章:
93
2015年辞旧岁徽章
日期:2019-10-10 10:51:15CU大牛徽章
日期:2014-02-21 14:21:56CU十二周年纪念徽章
日期:2020-10-15 16:55:55CU大牛徽章
日期:2014-02-21 14:22:07羊年新春福章
日期:2019-10-10 10:51:39CU大牛徽章
日期:2019-10-10 10:55:38季节之章:春
日期:2020-10-15 16:57:40ChinaUnix元老
日期:2019-10-10 10:54:42季节之章:冬
日期:2019-10-10 10:57:17CU大牛徽章
日期:2014-02-21 14:22:52CU大牛徽章
日期:2014-03-13 10:40:30CU大牛徽章
日期:2014-02-21 14:23:15
7 [报告]
发表于 2012-09-05 14:56 |只看该作者
我想我理解lz的意思了,不过我也没有找到可以完全达到 lz 效果的正则,反正用 [^.] 来表示一个非 . 的字符集合,但要是用 grep 来过滤的话,它会匹配其它数字。
我觉得可能是有难度,所以各个命令如 grep sed awk 都提供了取反的操作来实现 lz 所要的效果。

论坛徽章:
0
8 [报告]
发表于 2012-09-05 15:53 |只看该作者
这引出了一些其他的问题,我把所有键盘上的标点符号全部试了一遍。有些还是会引起一些奇怪的反应的。
比如这两行
12321*
32123\*
我用sed无法把他们区分开,不论搜索sed -n '/\*/p' 或者 sed -n '/*/p' 出来的结果都是这两行,如果我搜索/\\*/则匹配出来的是文件全部内容。

论坛徽章:
0
9 [报告]
发表于 2012-09-05 16:13 |只看该作者
回复 8# leonzl329
  1. echo '12321*
  2. 32123\*' |sed -n '/\\\B*/p'
  3. 32123\*
  4. echo '12321*
  5. 32123\*' |sed -n '/\\\B*/!p'
  6. 12321*
复制代码

论坛徽章:
0
10 [报告]
发表于 2012-09-05 21:27 |只看该作者
本帖最后由 samsun639 于 2012-09-05 21:27 编辑
leonzl329 发表于 2012-09-05 15:53
这引出了一些其他的问题,我把所有键盘上的标点符号全部试了一遍。有些还是会引起一些奇怪的反应的。
比如 ...


/\*/  : 只是取消了* 的meta, 所以两行都能匹配
/*/    :* 代表匹配全部,所以两行都能匹配
/\\*/   : \\ 取消了\的meta, 但是* 的meta还在,所以两行都能匹配

要匹配 \* 的话, 只能 /\\\*/ 了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP