我正在开发一个shell脚本,它将导出的Microsoft in-addr.apra.txt文件转换为更有用的格式,以便将来可以在其他产品中用于自动化目的。不,我正在解决一个问题(我不是程序员)无法以简单的方式解决。
示例脚本
x=123.223.224
rev $x
给了我
422.322.321
但我希望输出如下:
224.223.123
有没有简单的方法可以在没有转换或将每个组放入变量的情况下执行此操作?或者我有可以使用的样品吗?或者我可能使用错误的工具来做它?
答案 0 :(得分:2)
使用awk
:
x='123.223.224'
awk 'BEGIN{FS=OFS="."} {for (i=NF; i>=2; i--) printf $i OFS; print $1}' <<< "$x"
224.223.123
答案 1 :(得分:1)
使用awk
!
如果您的文本文件始终包含三个八位字节,只需使用.
作为分隔符:
echo $x | awk -F. '{ print $3 "." $2 "." $1 }'
对于更复杂的情况,请使用内部split()
:
echo $x | awk '{
n = split($0, a, ".");
for(i = n; i > 1; i--) {
printf "%s.", a[i];
}
print a[1]; }'
在此示例中,split()
将使用分隔符$0
分割每一行(作为参数.
传递),将结果数组保存到a
并返回该数组的长度(保存到n
)。请注意,与C不同,
split()
数组索引以一个开头。
或python
:
python -c "print '.'.join(reversed('$x'.split('.')))"
答案 2 :(得分:0)
这是我的剧本。
#!/bin/sh
value=$1
delim=$2
total_fields=$(echo "$value" | tr -cd $2 | wc -c)
let total_fields=total_fields+1
i=1
reverse_value=""
while [ $total_fields -gt 0 ]; do
cur_value=$(echo "$value" | cut -d${delim} -f${total_fields})
if [ $total_fields -ne 1 ]; then
cur_value="$cur_value${delim}"
fi
#echo "$cur_value"
reverse_value="$reverse_value$cur_value"
#echo "$i --> $reverse_value"
let total_fields=total_fields-1
done
echo "$reverse_value"
答案 3 :(得分:0)
使用一些小工具。
tr '.' '\n' <<< "$x" | tac | paste -sd.
224.223.123