3

10,000,000 桁の数字列があります。数値は何も区切られておらず、すべて次のように詰め込まれています (円周率で最初の 10,000,000 桁の長い文字列です):

1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679

sed を使用して、各数値を 16 進数の色の値に置き換えようとしています。これが私のコードです:

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 が 16 進コード置換から数値の変換を開始することです。それらのコンバージョンはそのままにしておきたいです。どうすればそれを防ぐことができますか? これが十分に明確であることを願っています。

次のような結果になります。

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

4 に答える 4

2

最初に sed コマンドを 1 つ追加し、既存の各コマンドに小さな変更を加えれば、このアプローチを続けることができます。

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
$ 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 配列は 0 ではなく 1 から始まるため、$i に 1 を追加します。

于 2013-01-17T02:50:28.860 に答える
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

おそらく使いやすいperl

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