如何使用正则表达式来反转bash脚本中的文本?

时间:2012-03-14 06:58:30

标签: regex bash

e.g。

ip_a="172.31.50.48"

逆转

ip_r="48.50.31.172" << use regex on this line for evaluate text then assign to ip_r

或域名

domain_a="www.linux.org"

逆转

domain_r="org.linux.www" << use regex on this line for evaluate text then assign to domain_r

5 个答案:

答案 0 :(得分:5)

Pure Bash,如Agrajag所述:

IFS='.'
array=( $ip )
n=${#array[@]}
for (( i=0; i<$((n/2)); i+=1 )); do
    save=${array[i]} 
    array[i]=${array[n-i-1]}
    array[n-i-1]=$save
done

printf "%s\n" "${array[*]}"

答案 1 :(得分:2)

ip_a="172.31.50.48"
ip_r=`echo $ip_a | awk '{n=split($0,A,".");S=A[n];{for(i=n-1;i>0;i--)S=S"."A[i]}}END{print S}'`
domain_a="www.linux.org"
domain_r=`echo $domain_a | awk '{n=split($0,A,".");S=A[n];{for(i=n-1;i>0;i--)S=S"."A[i]}}END{print S}'`
echo $ip_r
echo $domain_r

<强>输出

48.50.31.172
org.linux.www

答案 2 :(得分:1)

这可能对您有用:

ip_a="172.31.50.48"
domain_a="www.linux.org"
ip_r=$(sed 'G;:a;s/\([^.]*\)\.\(.*\n\)/\2.\1/;ta;s/\n//' <<<$ip_a)
domain_r=$(sed 'G;:a;s/\([^.]*\)\.\(.*\n\)/\2.\1/;ta;s/\n//' <<<$domain_a)
echo -e "$ip_r\n$domain_r"
48.50.31.172
org.linux.www

答案 3 :(得分:0)

执行此操作的最佳方法不是使用正则表达式。而是拆分字符串。获取数组,然后以相反的顺序打印数组。你如何做到这一点,取决于实现语言,python中的一个例子作为上面的评论给你。

伪码如下:

split string by . to obtain array.
reverse array
print array-elements, joined by .

答案 4 :(得分:0)

另一个awk解决方案:

 echo www.what.ever |\
 awk -F '.' '{ for (i=NF; i<=1 ; i--) { output=$i FS } ; print gensub(".$","","g",output) }'