Meskipun menggunakan ekspresi sed itu bagus itu memiliki keterbatasan. Misalnya gagal berikut:
$ echo "1000000000000000000000000000000+1" | sed -e 's/\([0-9]*\)+\([0-9]*\)/expr \1 + \2/e'
expr: 1000000000000000000000000000000: Numerical result out of range
Untuk mengatasi keterbatasan ini, saya cukup beralih ke kekuatan bawaan sed murni dan mengimplementasikan berikut ini:
#! / bin / sed -f
s / + / \ n / g
s / $ / \ n \ n0 /
: LOOP
s / ^ \ (. * *) \ (. \) \ n \ (. * *) \ (. \) \ n \ (. * *) \ n \ (. \) $ / 0 \ 1 \ n0 \ 3 \ n \ 5 \ n \ 6 \ 2 \ 4 /
h
s /^.* \ n. * \ n. * \ n \ (... \) $ / \ 1 /
# modul penambah penuh desimal
# INPUT: 3 digit (Carry in, A, B,)
# OUTPUT: 2bits (Carry, Sum)
s / $ /;000 = 00001 = 01002 = 02003 = 03004 = 04005 = 05006 = 06007 = 07008 = 08009 = 01011 = 01012 = 02012 = 04015 = 06016 = 06016 = 07017 = 08018 = 02019 = 02022 = 02022 = 03022 = 04022 = 020 06025 = 07026 = 08027 = 09028 = 10029 = 11030 = 03031 = 04033 = 05034 = 06035 = 08036 = 08037 = 09037 = 10039 = 12040 = 04041 = 05042 = 06044 = 09045 = 09045 = 09045 = 09046 = 11048 = 12048 = 0 13050 = 05051 = 06052 = 07053 = 08054 = 09055 = 10057 = 11057 = 13058 = 14060 = 06061 = 07062 = 08063 = 09064 = 10065 = 11066 = 12067 = 13068 = 14069 = 07071 = 09072 = 09073 = 10074 = 100 11075 = 12076 = 13077 = 14078 = 15079 = 16080 = 08081 = 09082 = 10083 = 11084 = 13086 = 14087 = 15088 = 16089 = 17089 = 17090 = 09091 = 10093 = 11094 = 12094 = 13095 = 14096 = 15098 = 17099 = 18100 = 01101 = 02102 = 03103 = 04104 = 05105 = 06106 = 07107 = 08108 = 09109 = 10110 = 02111 = 03112 = 05114 = 06115 = 07116 = 08117 = 08117 = 10119 = 10119 = 0612 = 0512 07125 = 08126 = 09127 = 10128 = 11129 = 12130 = 04131 = 05132 = 06133 = 07134 = 08135 = 09136 = 10137 = 11138 = 12139 = 13140 = 05141 = 06142 = 071423 = 08144 = 09145 = 10146 = 11147 = 12148 = 13149 = 14150 = 06151 = 07152 = 08153 = 09154 = 10155 = 11156 = 12157 = 13158 = 14159 = 15160 = 07161 = 08162 = 10164 = 11165 = 1216 = 1216 = 12 14168 = 15169 = 16170 = 08171 = 09172 = 10173 = 11174 = 12175 = 13176 = 14177 = 15178 = 16179 = 17180 = 09181 = 10182 = 11183 = 12184 = 13185 = 14186 = 15187 = 16188 = 1718 = 1018 = 12193 = 13194 = 14195 = 15196 = 16197 = 17198 = 18199 = 19 /
s / ^ \ (... \) [^;] *; [^;] * \ 1 = \ (.. \). * / \ 2 /
H
g
s / ^ \ (. * *) \ n \ (. * *) \ n \ (. * *) \ n ... \ n \ (. \) \ (. \) $ / \ 1 \ n \ 2 \ n \ 5 \ 3 \ n \ 4 /
/ ^ \ ([0] * \) \ n \ ([0] * \) \ n / {
s /^.* \ n. * \ n \ (. * *) \ n \ (. \) / \ 2 \ 1 /
s / ^ 0 \ (. * \) / \ 1 /
q
}
b LOOP
Cara kerjanya adalah dengan menerapkan modul penambah desimal yang menambahkan dua digit input (A dan B) serta Carry Bit dan menghasilkan Sum dan Carry bit. Idenya dipinjam dari elektronik di mana biner adder melakukan hal yang sama untuk nomor biner. Yang harus kita lakukan adalah melingkari penambah di atas semua angka dan kita dapat menambahkan angka panjang acak (dibatasi oleh memori). Di bawah ini adalah penambah yang sedang beraksi:
./decAdder.sed
666666666666666666666666666666999999999999991111111112222+1100000000000000000000011111111111111111111111111111111111
1766666666666666666666677777778111111111111102222222223333
Dengan cara yang persis sama seseorang dapat mengimplementasikan adder biner (atau basis lainnya). Yang harus Anda lakukan adalah mengganti garis yang dimulai dengan s/$/;000=00001...
pola substitusi yang tepat untuk basis yang diberikan. Sebagai contoh: s/$/;000=00001=01010=01011=10100=01101=10110=10111=11/
adalah pola substitusi untuk penambah panjang biner sewenang-wenang.
Anda dapat memasukkan kode yang didokumentasikan di github saya .