这行 sed 脚本到底做了什么 ?

发布于 2022-09-12 14:01:15 字数 733 浏览 22 评论 0

看到一个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 技术交流群。

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

发布评论

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

评论(1

北城挽邺 2022-09-19 14:01:15

直接讲后面的正则部分


你写的.*(贪婪匹配,也就是从最长的字符串开始逐个字符缩减匹配
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 (
到这个时候终于匹配成功,于是这部分内容被替换,也就是被删掉。

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