Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
3.7k views
in Technique[技术] by (71.8m points)

这行 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/[^(]*(//}'

百思不得骑姐


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

直接讲后面的正则部分


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


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...