我有SNMP输出,如:
IP-MIB::ipNetToMediaPhysAddress.5122.192.19.3.25 = STRING: 34:8:4:56:f4:70
正如您所看到的,mac-address输出不正确,我用sed修复它:
echo IP-MIB::ipNetToMediaPhysAddress.5122.192.19.3.25 = STRING: 34:8:4:56:f4:70 |
sed -e 's/\b\(\w\)\b/0\1/g'
输出:
IP-MIB::ipNetToMediaPhysAddress.5122.192.19.03.25 = STRING: 34:08:04:56:f4:70
它修复了地址,但也将IP从192.19.3.25更改为192.19.03.25。如何避免它并强制仅在STRING:
之后或仅在字符串中的最后一个空格之后执行sed?
答案 0 :(得分:4)
MAC地址以冒号分隔。您可以使用它来限制替换。这将执行您感兴趣的替换,但仅当单词字符位于冒号旁边时:
sed -e 's/\b\w:/0&/g; s/:\(\w\)\b/:0\1/g'
例如:
$ echo IP-MIB::ipNetToMediaPhysAddress.5122.192.19.3.25 = STRING: 34:8:4:56:f4:70 | sed -e 's/\b\w:/0&/g; s/:\(\w\)\b/:0\1/g'
IP-MIB::ipNetToMediaPhysAddress.5122.192.19.3.25 = STRING: 34:08:04:56:f4:70
s/\b\w:/0&/g
如果单词字符前面有分词符\b
,后跟冒号,则执行替换。由于我们只需要在整个匹配文本的前面放置零,而不仅仅是它的某些部分,我们可以省略parens并使用&
来复制匹配的文本。
s/:\(\w\)\b/:0\1/g
如果有任何剩余的替换需要进行,其中单词字符前面有一个冒号,后跟一个分词,这就是它们。
注意:我们使用的GNU扩展可能无法移植。
答案 1 :(得分:0)
如果MAC地址位于行尾
,则使用sed的另一种方法echo IP-MIB::ipNetToMediaPhysAddress.5122.192.19.3.25 = STRING: 4:8:d:56:f4:7 |
sed -E '
s/$/:/
:A
s/([^[:xdigit:]])([[:xdigit:]]:)/\10\2/
tA
s/:$//'