使用sed将数字0-9从大列表转换为十六进制值

使用sed将数字0-9从大列表转换为十六进制值,sed,hex,Sed,Hex,我有一个10000000位的数字串。数字之间没有任何分隔,它们都是这样挤在一起的(它是pi中前10000000位的长字符串): 我尝试使用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/

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

我尝试使用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
尝试:

LC_LANG=C sed-e's/[0-9]/,\u1,/g'pi2 | sed-e's/,\u 0,/#f5/g;s/,_1,/#FFE4B5/g….'
并根据文件内容相应地更改“分隔符”
。(这样它就不会干扰内容)。
也许你需要增加一个空间或空间;每个颜色代码之后?。。。也可以偶尔换行^ ^

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

sed -e 's/\(.\)/\1,/g' -e 's/0,/#F5F5F5/g' -e 's/1,/#FFE4B5/g'  ...  < pi > pi2
sed-e's/\(.\)/\1、/g'-e's/0、/#f5f5/g'-e's/1、/#FFE4B5/g'.pi2
1) 在输入中用逗号标记每个整数

2) 进行替换时,仅替换后跟逗号的整数,并在处理完每个整数后删除逗号


另外,作为一个bug修复,您还应该在每个替换上添加
g
选项。

可能更易于使用
perl

perl -pe 'BEGIN{ $/=\1 }; s/0/#F5F5F5/ or s/1/#FFE4B5/ or s/2/#98FB98/ ...'
$cat tst.awk
开始{
代码=“F5F5F5FF4B5 98FB98 ADFF2F FF69B4 BA55D3 FF6347 2E8B57 8B4513 000000”
拆分(代码,十六进制)
FS=“”
}

{对于(i=1;i)请说明列表的格式(例如,一个数字列表,每个数字为1000万位,或一个100万个十位数字的列表,总计1000万位),并提供一个您希望看到的转换前后的数字部分的示例。它是否像“1042”->“FFE4B5#F5F5#FF69B4#98FB98”是的,这就是我想看到的:“1042”->“#ffeb5#f5f5#FF69B4#98FB98”好的,我认为“字符串”比“列表”更好因为列表似乎暗示了多行数字。或者,您可以先将数字转换为字母范围,然后对字母运行sed命令。例如:
sed-e'y/0123456789/GHIJKLMNOP/'-e's/G/#f5f5/G'-e's/H/#FFE4B5/G'
。性能在这里可能不是问题,但这保留了原创性l长度为1000万而不是翻倍,然后搜索单个字符而不是两个字符。
LC_LANG=C sed -e 's/[0-9]/,_\1_,/g' <pi >pi2| sed -e 's/,_0_,/#F5F5F5/g;s/,_1_,/#FFE4B5/g .....'
sed -e 's/\(.\)/\1,/g' -e 's/0,/#F5F5F5/g' -e 's/1,/#FFE4B5/g'  ...  < pi > pi2
perl -pe 'BEGIN{ $/=\1 }; s/0/#F5F5F5/ or s/1/#FFE4B5/ or s/2/#98FB98/ ...'
$ 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