Unix Shell Sed模式与空间的三月

时间:2017-07-07 06:14:41

标签: regex bash shell sed

我希望{" DA "之后的grep数据:

BSSID:Broadcast DA:Broadcast SA:da:a1:19:dd:aa:92 (oui Unknown) Probe Request

输出应为

Broadcast  

和数据

BSSID:d8:49:2f:74:dc:cf (oui Unknown) DA:d8:49:2f:74:dc:cf (oui Unknown) SA:d8:49:2f:74:dc:cf (oui Unknown) Probe Request     

应该是

d8:49:2f:74:dc:cf  

我使用命令

echo " -90dB signal [bit 29] BSSID:Broadcast DA:Broadcast SA:f4:9f:f3:d6:68:bc (oui Unknown) Probe Request (PremiumOutletsJP) [1.0 2.0 5.5 11.0 Mbit]" | 
sed -rn 's/.*DA:(.*)[:space:]/\1/p'
#it is echo "$DATA"|sed -rn 's/.*DA:(.*)[:space:]/\1/p'

但输出是:

 Broadcast SA:f4:9f:f3:d6:68:bc (oui Unknown) Probe Request (PremiumOutletJP) [1.0 2.0 5.5 11.0 Mbit]

或者我尝试命令:

echo "$DATA" | sed -rn 's/ DA:(.*) /\1/p'

那些是错的。 任何人都可以指导我修复错误并告诉我如何学习正则表达式的模式匹配?谢谢。

1 个答案:

答案 0 :(得分:0)

grep解决方案:使用环顾四周。

echo "$DATA"|grep -oP 'DA:\K[^ ]+'
Broadcast
echo "$DATA"|grep -oP 'BSSID:\K[^ ]+'
d8:49:2f:74:dc:cf

使用sed

echo "$DATA"| sed -r 's/BSSID:([^ ]+).*/\1/g'
d8:49:2f:74:dc:cf

echo "$DATA"| sed -r 's/.*DA:([^ ]+).*/\1/g'
Broadcast

此处需要的字符串在()中捕获,之后使用\1调用。 ([^ ]+)意味着捕获任何东西直到看到空间角色。