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