我正在尝试将域转换为我正在编写的一些使用唯一名称间距的脚本。
所以输入看起来像example.com,输出是com.example;虽然是的,但我知道s/\(\w\+\).*\(\w\+\)$/\2.\1/
方法,要求是能够动态支持多个子域,因此静态'\2.\1'
不起作用。基于BRE的POSIX REGEX看起来如何?
答案 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