使用sed将零添加到字符串的一部分

时间:2018-02-12 07:22:25

标签: bash sed

我有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?

2 个答案:

答案 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/:$//'