在sed中执行命令,同时保留行中不匹配的部分

时间:2019-06-20 16:37:04

标签: shell sed type-conversion

这很简单-我有一个数据流,它的IPv4地址编码为十六进制表示形式,例如0c22384e,它代表12.34.56.78。

我想出了sed命令,将捕获的八位字节替换为以点分隔的十进制数字。

echo "0c22384e" | sed -E 's/([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})/printf "%d.%d.%d.%d" 0x\1 0x\2 0x\3 0x\4/eg'

一旦我添加了一些本来不应该匹配的文本,它就可以使用单个数字,但是它也会传递给执行-在这种情况下是通过printf。

如何保留行中不匹配的部分,而无需传递执行?

1 个答案:

答案 0 :(得分:0)

一行中只有一个地址,您就可以使用

echo "Something 0c22384e more" |
 sed -r 's/(.*)([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})(.*)/"\1" 0x\2 0x\3 0x\4 0x\5 "\6"/' |
 xargs -n6 printf '%s%d.%d.%d.%d%s\n' 

编辑:
一行和更多地址的替换解决方案
提供更多行的解决方案(假设流中没有“ \ r”):

echo "Something 0c22384e more 0c22385e
Second line: 0c22386e and 0c223870
Third line: 0c22388e and 0c223890
4th line: 0c2238ae and 0c2238b0" |
  sed 's/$/\r/' |
  sed -r 's/[0-9a-f]{8}/\n&\n/g' |
  sed -r 's/([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})/printf '%d.%d.%d.%d' 0x\1 0x\2 0x\3 0x\4/e' |
  tr -d '\n' |
  tr '\r' '\n'