这行 sed 脚本到底做了什么 ?
看到一个sed脚本,可通过ping得到域名公网IP地址, 如下可正常工作,ping baidu.com -c 1| sed '1{s/[^(]*(//;s/).*//;q}'
拆分开来等同于 ping baidu.com -c 1| sed '1{s/[^(]*(//}' | sed '1{s/).*//;q}'
我们用他处理数据:
PING baidu.com (220.181.38.148) 56(84) bytes of data.
得到 220.181.38.148
问题来了
ping baidu.com -c 1| sed '1{s/[^(]*(//}'
执行结果为啥不是84) bytes of data.
我写的 ping baidu.com -c 1| sed '1{s/.*(//}'
处理结果就是 84) bytes of data.
一行同时匹配两个目标,从左到右执行第一个?执行第一个,这个是sed 默认的吗?
为了求解我也可以这么写: ping baidu.com -c 1| sed '{s/.*[ ](//}'
这行脚本到底做了什么 ping baidu.com -c 1| sed '1{s/[^(]*(//}'
百思不得骑姐
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
直接讲后面的正则部分
你写的
.*(
贪婪匹配,也就是从最长的字符串开始逐个字符缩减匹配PING baidu.com (220.181.38.148) 56(84) bytes of data.
PING baidu.com (220.181.38.148) 56(84) bytes of data
PING baidu.com (220.181.38.148) 56(84) bytes of dat
PING baidu.com (220.181.38.148) 56(84) bytes of da
PING baidu.com (220.181.38.148) 56(84) bytes of d
PING baidu.com (220.181.38.148) 56(84) bytes of
PING baidu.com (220.181.38.148) 56(84) bytes of
PING baidu.com (220.181.38.148) 56(84) bytes o
PING baidu.com (220.181.38.148) 56(84) bytes
PING baidu.com (220.181.38.148) 56(84) bytes
PING baidu.com (220.181.38.148) 56(84) byte
PING baidu.com (220.181.38.148) 56(84) byt
PING baidu.com (220.181.38.148) 56(84) by
PING baidu.com (220.181.38.148) 56(84) b
PING baidu.com (220.181.38.148) 56(84)
PING baidu.com (220.181.38.148) 56(84)
PING baidu.com (220.181.38.148) 56(84
PING baidu.com (220.181.38.148) 56(8
PING baidu.com (220.181.38.148) 56(
到这里匹配了正则,于是将这部分进行替换,替换的内容为
/
中的内容,在这里是空。所以这段内容相当于被删掉了。再来看
[^(]*
,省略部分匹配过程,直到缩减为PING baidu.com (220.181.38.148) 56(
注意此时正则并未匹配成功,因为
[^(]*
要求的是所有非(
字符。所以将会继续缩减,直到只剩下一个(
PING baidu.com (
到这个时候终于匹配成功,于是这部分内容被替换,也就是被删掉。