sed 更改 dns 日志字符串格式

sed 更改 dns 日志字符串格式

我想使用 sed 更改以下文本:

(3)www(5)first(3)nth(6)domain(3)com(0)

到:

www.first.nth.domain.com

假设有 2 到 n+3 个组(无穷大),是否可以捕获括号分隔符之间的每个组,然后按句点分隔符的顺序重建?还有别的办法吗?

我已经熟悉了:

s/\(\d+\)/./g

但这只会产生:

.www.first.nth.domain.com.

答案1

这似乎满足您的要求。我不完全确定您是否想要使用括号中的数字来验证游程长度,但我假设不是。

echo '(3)www(5)first(3)nth(6)domain(3)com(0)' |
sed -r -e 's/^\([0-9]+\)//' -e 's/(.)\([0-9]+\)(.)/\1.\2/g' -e 's/\([0-9]+\)$//'
www.first.nth.domain.com

使用sed三种不同的 RE。第一个和最后一个去掉有界的前导和尾随(\d+)表达式。中间的一个剥离了剩余的部分。

答案2

怎么样s/\([0-9]+\)/./g; s/^\.|\.$//g

\d某些 sed 实现不会识别您的构造。上面是一个Posix扩展正则表达式。哪个,你知道,应该工作。

诀窍sed就是逐步进行。通过替换括号内的数字,您已经完成了大部分工作;只是您没有意识到可以使用第二个正则表达式来清理结果。

相关内容