如何让 sed 替换除一个字符之外的所有字符

如何让 sed 替换除一个字符之外的所有字符

我有一条形式为这样的声明:atPhysAddress[1][1.10.0.0.98]我想删除除第二个括号中的第一个或任何落在那里的值之外的所有细节,我该如何实现呢?(即,我只想省略第二个括号中的第一个整数)

答案1

例如

$ echo "atPhysAddress[1][1.10.0.0.98]" | sed 's/\(\[.*\]\)\[\(.\).*\]/\1[\2]/'
atPhysAddress[1][1]

仅获取第二个括号中的第一个数字:

$ echo "atPhysAddress[1][12.10.0.0.98]" | sed 's/.*\]\[\([^.]*\).*\]/\1/'
12

答案2

你可以做类似的事情

sed -r 's/\[([0-9]+)\.([0-9]+)\.([0-9]+)\.([0-9]+)\.([0-9]+)\]/[XX.\2.XX.XX.XX]/'

匹配[后跟 5 个点分隔的整数序列,然后]重新替换第二个(用 XX 标记删除的整数 - 当然是可选的)。使用此-r选项使表达式更易于阅读,但如果 GNU sed 不可用,您可以在 POSIX sed 中重写它。通过将 \2 更改为 \1、\3、\4 等,您可以选择要重新替换的数字。

echo "atPhysAddress[1][1.10.0.0.98]" | sed -r 's/\[([0-9]+)\.([0-9]+)\.([0-9]+)\.([0-9]+)\.([0-9]+)\]/[XX.\2.XX.XX.XX]/'
atPhysAddress[1][XX.10.XX.XX.XX]

相关内容