都可以成功匹配,输出为何不一样?

发布于 2022-09-04 20:19:28 字数 549 浏览 10 评论 0

debian8@debian:~$ echo " x x1 x2 y1 z1 x345" |awk -v RS="x1*" '$0=RT'
x
x1
x2
x345

debian8@debian:~$ echo " x x1 x2 y1 z1 x345" |awk -v RS="x[0-9]*" '$0=RT'
x
x1
x2
x345
为何echo " x x1 x2 y1 z1 x345" |awk -v RS="x1*" '$0=RT' 的输出结果多了个空行?

图片描述


如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

朮生 2022-09-11 20:19:28
#查看行数区别:
[root@~]#echo " x x1 x2 y1 z1 x345" |awk -v RS="x[^ ]*" '{print "RT:",RT,"NF:",NF,"NR:",NR}'
RT: x NF: 0 NR: 1
RT: x1 NF: 0 NR: 2
RT: x2 NF: 0 NR: 3
RT: x345
 NF: 2 NR: 4
[root@~]#echo " x x1 x2 y1 z1 x345" |awk -v RS="x[0-9]*" '{print "RT:",RT,"NF:",NF,"NR:",NR}'
RT: x NF: 0 NR: 1
RT: x1 NF: 0 NR: 2
RT: x2 NF: 0 NR: 3
RT: x345 NF: 2 NR: 4
RT:  NF: 0 NR: 5

发现,第一个个x[^ ]*分隔字串成了4行内容,而x[0-9]把字符串分成了5行内容,差异在最后一行。

个人理解:字符串末尾包含一个结束符/换行符,这里可以看成正则里表示末尾位置的$。原字符串末尾看成:……z1 x345$
第一个正则x[^ ]*x$(含)都一起匹配了,当成了一个换行符,因为$不是空格;
第二个正则x[0-9]不能匹配到$符号,所以变成了x345一个换行符,后面紧跟着一个原有的结束符$
从而行数比第一个正则表达式多一行。

打印最后一个RT的时候,x345$——这个RT字符串会被打印成两行,就好像这个字符串是“x345\n”

可能把我举例中所有的$都当成\n更好理解,因为前置实际没有宽度(内容),只表示一个位置;而后者是有宽度(有内容,有对应的ASC码)。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文