- 论坛徽章:
- 0
|
【请教】如何在Bourne Shell中进行字符变换,把a变成n这样的
高!实在高!
其实用awk也能实现,但非常非常罗嗦,跟laoxia一样的思路。
思路是:利用sprintf的格式输出,建立一字典数组,这数组以a-z,A-Z为数组标识,其ASCII值为数组单元值,然后根据数组来对比,这样就可以加减乘除计算了。
awk '{ FS=""; for(i=65;i<=90;i++) {temp=sprintf("%c",i);dic[temp]=i;} for(i=97;i<=122;i++) {temp=sprintf("%c",i);dic[temp]=i;};for (i=1;i<=NF;i++){if(dic[$i]>=97 && dic[$i]<=109)printf("%c",dic[$i]+13);else if (dic[$i]>=110 && dic[$i]<=122)printf("%c",dic[$i]-13);else if(dic[$i]>=65 && dic[$i]<=77)printf("%c",dic[$i]+13);else if(dic[$i]>=78 && dic[$i]<=90)printf("%c",dic[$i]-13);else printf("%s",$i);}print(""}' filename
不用每次遍历数组,只要判断从文件里读出来的字符$i对应的dic[$i]的值,并以printf("%c",dic[$i])输出。
但这有个致命的弱点,因为awk切割字段的时候,每个记录的字段数不能超过100,超过则不进行切割,所以这东东只能运行少于每句少于100字符的转换。 |
|