如何使用正则表达式反转域名?

时间:2014-03-05 01:09:53

标签: regex sed dns

我正在尝试将域转换为我正在编写的一些使用唯一名称间距的脚本。

所以输入看起来像example.com,输出是com.example;虽然是的,但我知道s/\(\w\+\).*\(\w\+\)$/\2.\1/方法,要求是能够动态支持多个子域,因此静态'\2.\1'不起作用。基于BRE的POSIX REGEX看起来如何?

5 个答案:

答案 0 :(得分:2)

正则表达式是该作业的错误工具。有很多方法可以做到,这里有一个:

address=www.example.com
dotted=$(echo $address. | tac -s.)
reversed=${dotted%?}
echo $reversed
# => com.example.www

编辑:如果你坚持使用sed和正则表达式:

echo 'www.example.com' | sed 's/\([^.]*\)\(\.\?\)\([^.]*\)\(\.\?\)\([^.]*\)\(\.\?\)\([^.]*\)\(\.\?\)\([^.]*\)/\9\8\7\6\5\4\3\2\1/g'
# => com.example.www

但是,它最多可以处理五个组件(a.b.c.d.e)。如果你想要便携性,jlhonora的答案仍然是最好的。

答案 1 :(得分:1)

您可以使用awk

echo 'test.example.com' | awk -F '.' '{out=$1; for(i=2;i<=NF;i++){ out=$i"."out}; print out}'

答案 2 :(得分:1)

这可能适合你(GNU sed):

sed -r 'G;:a;s/^\n//;s/^([^.\n]+)(\.*)(.*\n)/\3\2\1/;ta' file

这会附加换行符,然后在其后附加域的每个部分。

当添加最后一部分时,删除换行符。

答案 3 :(得分:0)

我会找到一种具有数组和反向函数的语言:

perl -lpe '$_ = join ".", reverse split /\./' <<< "$domain"

答案 4 :(得分:0)

这是一个应该还原dns名称的awk

awk -F\. '{for (i=NF;i>=1;i--) printf "%s"(i==1?RS:FS),$i}'

示例:

echo 'test.example.com.br' | awk -F\. '{for (i=NF;i>=1;i--) printf "%s"(i==1?RS:FS),$i}'
br.com.example.test

这适用于任何长度的DNS名称:

this.is.my.dns.name.com.gov.us

给出

us.gov.com.name.dns.my.is.this