sed 正则匹配的机制?

使用sed做正则匹配时发现一个问题:
为了匹配一个特定英文之后的数字(例如id123,取出123),写了下面的正则

echo "s1" | sed -rn 's/^.*s([0-9]*).*$/\1/p'
输出为1,匹配到了s1中的数字1

echo "s1s" | sed -rn 's/^.*s([0-9]*).*$/\1/p'
输出为空,没有匹配到s1?

为什么和我想的不一样呢?
s[0-9]*为什么不匹配s1s呢,我前后写的都是.*呀。

不了解正则匹配的机制,请大神帮忙给讲讲。
谢谢谢谢~

阅读 4.6k
1 个回答
^.*s([0-9]*).*$
^ 开始 $结尾
.任意非换行字符
*0次或任意次
()分组
/\1/取出分组的第一个相当于group(1)  group(0)是满足正则匹配的最长字段
echo "s1" | sed -rn 's/^.*s([0-9]*).*$/\1/p' 所以第一组是1
echo "s1s" | sed -rn 's/^.*s([0-9]*).*$/\0/p' 全部匹配到了s1s
echo "s1s" | sed -rn 's/^.*s([0-9]*).*$/\1/p' 空,因为.*s贪婪的匹配了s1s 所以()分组匹配*次为0什么都没匹配到
echo "s1s" | sed -rn 's/^.*s([0-9]+).*$/\1/p' 改为至少匹配一次就匹配到了
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题