grep 中的* 在这里遇到个问题了!

caddor9100 2015-03-10 04:54:22
grep -n '^\([0-9]\)*\1$' filename

filename:
181

这句命令导致搜索不出任何结果来。

于是我改成:

grep -n '^\([0-9]\).*\1$' filename 后就可以出来结果。

求原因!!!

问题2: * 是匹配0及其以上的字符。

那么好了,如果我想匹配类似 181这种串的话,

grep -n '^\([0-9]\)*\1$' filename

* 直接跟在 \(.)\后面, grep可能会将其解释为: 0及其以上个字符!!!!

违背我的本意了。

...全文
223 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2015-11-20
  • 打赏
  • 举报
回复
正则表达式速查 正则表达式举例 正则表达式学习 (4页A4纸)http://download.csdn.net/detail/zhao4zhong1/1808549
奔跑的路 2015-03-11
  • 打赏
  • 举报
回复
引用 2 楼 caddor9100 的回复:
[quote=引用 1 楼 lee244868149 的回复:] 修正一下:“问题2: * 是匹配0及其以上的字符” * 在正则表达式中是表示匹配之前的项0次或多次, . 表示匹配任意一个字符 grep -n '^\([0-9]\)*\1$' 在匹配时,先匹配到的是1,然后将1和第二位匹配,但是第二位是8,所以匹配不成功,没有输出,但是如果后面一位也是1,比如11 或者111 这样的行就能匹配到了 你后面加上 . 后,它会匹配任意一个字符,所以^[0-9]匹配了1, .* 匹配了 行头1 到行尾1 之间的字符, \1$匹配了行尾的1,这样就输出181了,
太谢谢你了。 你让我搞懂一个核心问题: 通配符中 * 是任意字符 而 正则中: * 也是任意字符,但是 要特别注意到 它的次数可以让前一个字符0次或者0次以上。 难怪,我总是理解不对。 [/quote] 没问题可结贴
caddor9100 2015-03-11
  • 打赏
  • 举报
回复
引用 1 楼 lee244868149 的回复:
修正一下:“问题2: * 是匹配0及其以上的字符” * 在正则表达式中是表示匹配之前的项0次或多次, . 表示匹配任意一个字符 grep -n '^\([0-9]\)*\1$' 在匹配时,先匹配到的是1,然后将1和第二位匹配,但是第二位是8,所以匹配不成功,没有输出,但是如果后面一位也是1,比如11 或者111 这样的行就能匹配到了 你后面加上 . 后,它会匹配任意一个字符,所以^[0-9]匹配了1, .* 匹配了 行头1 到行尾1 之间的字符, \1$匹配了行尾的1,这样就输出181了,
太谢谢你了。 你让我搞懂一个核心问题: 通配符中 * 是任意字符 而 正则中: * 也是任意字符,但是 要特别注意到 它的次数可以让前一个字符0次或者0次以上。 难怪,我总是理解不对。
奔跑的路 2015-03-10
  • 打赏
  • 举报
回复
修正一下:“问题2: * 是匹配0及其以上的字符” * 在正则表达式中是表示匹配之前的项0次或多次, . 表示匹配任意一个字符 grep -n '^\([0-9]\)*\1$' 在匹配时,先匹配到的是1,然后将1和第二位匹配,但是第二位是8,所以匹配不成功,没有输出,但是如果后面一位也是1,比如11 或者111 这样的行就能匹配到了 你后面加上 . 后,它会匹配任意一个字符,所以^[0-9]匹配了1, .* 匹配了 行头1 到行尾1 之间的字符, \1$匹配了行尾的1,这样就输出181了,

23,120

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧