3

我有一个 10,000,000 位的数字字符串。数字没有任何分隔,它们都像这样挤在一起(它是 pi 中前 10,000,000 位数字的长字符串):

1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679

我正在尝试使用 sed 将每个数字替换为十六进制颜色值。这是我的代码:

sed -e 's/0/#F5F5F5/' -e 's/1/#FFE4B5/' -e 's/2/#98FB98/' -e 's/3/#ADFF2F/' -e 's/4/#FF69B4/' -e 's/5/#BA55D3/' -e 's/6/#FF6347/' -e 's/7/#2E8B57/' -e 's/8/#8B4513/' -e 's/9/#000000/' < pi > pi2

麻烦的是,sed 开始从我的十六进制代码替换中转换数字。我希望这些转换保持不变。我该如何防止呢?希望这足够清楚。

最终得到这样的结果:

#FFE#FF#FF634#2E#8B4513B57#000000B4B#BA55D34159#98FB986535897932384626433832795#F5F5F528841971693993751
4

4 回答 4

2

如果您在开头添加一个 sed 命令并对每个现有命令进行小的更改,则可以坚持使用此方法:

sed -e 's/\(.\)/\1,/g' -e 's/0,/#F5F5F5/g' -e 's/1,/#FFE4B5/g'  ...  < pi > pi2

1) 用逗号标记输入中的每个整数。

2)当你做替换时,只替换后面跟着逗号的整数,当你完成每个整数时删除逗号。

此外,作为错误修复,您还应该g在每次替换时添加选项。

于 2013-01-16T19:50:57.750 回答
0

尝试:

LC_LANG=C sed -e 's/[0-9]/,_\1_,/g' <pi >pi2| sed -e 's/,_0_,/#F5F5F5/g;s/,_1_,/#FFE4B5/g .....'

,__, 根据文件的内容更改“分隔符” 。(这样它就不会干扰内容)。也许您需要添加一个空格或 ; 在每个颜色代码之后?...也许偶尔也会换行^^

于 2013-01-16T19:27:57.113 回答
0
$ cat tst.awk
BEGIN{
   codes="F5F5F5 FFE4B5 98FB98 ADFF2F FF69B4 BA55D3 FF6347 2E8B57 8B4513 000000"
   split(codes,hex)
   FS=""
}
{  for (i=1;i<=NF;i++)
      printf "#%s",hex[($i)+1]
   print ""
}

$ echo 1415 | awk -f tst.awk
#FFE4B5#FF69B4#FFE4B5#BA55D3

$ echo 1042 | awk -f tst.awk
#FFE4B5#F5F5F5#FF69B4#98FB98

上面只是创建了一个数组,将数字映射到字符串中的代码,然后为输入中的每个数字打印数组中的字符串。awk 数组从 1 开始,而不是 0,因此将 1 添加到 $i。

于 2013-01-17T02:50:28.860 回答
0

可能更容易使用perl

perl -pe 'BEGIN{ $/=\1 }; s/0/#F5F5F5/ or s/1/#FFE4B5/ or s/2/#98FB98/ ...'
于 2013-01-16T20:40:17.067 回答