add initial version
[unicode-write.sh.git] / unicode-write.sh
1 #!/bin/bash
2
3 # unicode-write.sh by Felix Kästner (fpunktk), GPL3
4
5 # a script that transforms text into random similar looking unicode characters
6 # it can be used to generate human readable text that cannot easily be processed by machines
7
8 # selection of replace characters
9 # echo "
10 # # complete lower upper
11 # abcdefghijklmnopqrstuvwxyz
12 # ABCDEFGHIJKLMNOPQRSTUVWXYZ
13 # 𝐚𝐛𝐜𝐝𝐞𝐟𝐠𝐡𝐢𝐣𝐤𝐥𝐦𝐧𝐨𝐩𝐪𝐫𝐬𝐭𝐮𝐯𝐰𝐱𝐲𝐳
14 # 𝐀𝐁𝐂𝐃𝐄𝐅𝐆𝐇𝐈𝐉𝐊𝐋𝐌𝐍𝐎𝐏𝐐𝐑𝐒𝐓𝐔𝐕𝐖𝐗𝐘𝐙
15 # 𝒂𝒃𝒄𝒅𝒆𝒇𝒈𝒉𝒊𝒋𝒌𝒍𝒎𝒏𝒐𝒑𝒒𝒓𝒔𝒕𝒖𝒗𝒘𝒙𝒚𝒛
16 # 𝑨𝑩𝑪𝑫𝑬𝑭𝑮𝑯𝑰𝑱𝑲𝑳𝑴𝑵𝑶𝑷𝑸𝑹𝑺𝑻𝑼𝑽𝑾𝑿𝒀𝒁
17 # 𝓪𝓫𝓬𝓭𝓮𝓯𝓰𝓱𝓲𝓳𝓴𝓵𝓶𝓷𝓸𝓹𝓺𝓻𝓼𝓽𝓾𝓿𝔀𝔁𝔂𝔃
18 # 𝓐𝓑𝓒𝓓𝓔𝓕𝓖𝓗𝓘𝓙𝓚𝓛𝓜𝓝𝓞𝓟𝓠𝓡𝓢𝓣𝓤𝓥𝓦𝓧𝓨𝓩
19 # 𝖆𝖇𝖈𝖉𝖊𝖋𝖌𝖍𝖎𝖏𝖐𝖑𝖒𝖓𝖔𝖕𝖖𝖗𝖘𝖙𝖚𝖛𝖜𝖝𝖞𝖟
20 # 𝕬𝕭𝕮𝕯𝕰𝕱𝕲𝕳𝕴𝕵𝕶𝕷𝕸𝕹𝕺𝕻𝕼𝕽𝕾𝕿𝖀𝖁𝖂𝖃𝖄𝖅
21 # 𝖺𝖻𝖼𝖽𝖾𝖿𝗀𝗁𝗂𝗃𝗄𝗅𝗆𝗇𝗈𝗉𝗊𝗋𝗌𝗍𝗎𝗏𝗐𝗑𝗒𝗓
22 # 𝖠𝖡𝖢𝖣𝖤𝖥𝖦𝖧𝖨𝖩𝖪𝖫𝖬𝖭𝖮𝖯𝖰𝖱𝖲𝖳𝖴𝖵𝖶𝖷𝖸𝖹
23 # 𝗮𝗯𝗰𝗱𝗲𝗳𝗴𝗵𝗶𝗷𝗸𝗹𝗺𝗻𝗼𝗽𝗾𝗿𝘀𝘁𝘂𝘃𝘄𝘅𝘆𝘇
24 # 𝗔𝗕𝗖𝗗𝗘𝗙𝗚𝗛𝗜𝗝𝗞𝗟𝗠𝗡𝗢𝗣𝗤𝗥𝗦𝗧𝗨𝗩𝗪𝗫𝗬𝗭
25 # 𝘢𝘣𝘤𝘥𝘦𝘧𝘨𝘩𝘪𝘫𝘬𝘭𝘮𝘯𝘰𝘱𝘲𝘳𝘴𝘵𝘶𝘷𝘸𝘹𝘺𝘻
26 # 𝘈𝘉𝘊𝘋𝘌𝘍𝘎𝘏𝘐𝘑𝘒𝘓𝘔𝘕𝘖𝘗𝘘𝘙𝘚𝘛𝘜𝘝𝘞𝘟𝘠𝘡
27 # 𝙖𝙗𝙘𝙙𝙚𝙛𝙜𝙝𝙞𝙟𝙠𝙡𝙢𝙣𝙤𝙥𝙦𝙧𝙨𝙩𝙪𝙫𝙬𝙭𝙮𝙯
28 # 𝘼𝘽𝘾𝘿𝙀𝙁𝙂𝙃𝙄𝙅𝙆𝙇𝙈𝙉𝙊𝙋𝙌𝙍𝙎𝙏𝙐𝙑𝙒𝙓𝙔𝙕
29 # 𝚊𝚋𝚌𝚍𝚎𝚏𝚐𝚑𝚒𝚓𝚔𝚕𝚖𝚗𝚘𝚙𝚚𝚛𝚜𝚝𝚞𝚟𝚠𝚡𝚢𝚣
30 # 𝙰𝙱𝙲𝙳𝙴𝙵𝙶𝙷𝙸𝙹𝙺𝙻𝙼𝙽𝙾𝙿𝚀𝚁𝚂𝚃𝚄𝚅𝚆𝚇𝚈𝚉
31 # ⓐⓑⓒⓓⓔⓕⓖⓗⓘⓙⓚⓛⓜⓝⓞⓟⓠⓡⓢⓣⓤⓥⓦⓧⓨⓩ
32 # ⒶⒷⒸⒹⒺⒻⒼⒽⒾⒿⓀⓁⓂⓃⓄⓅⓆⓇⓈⓉⓊⓋⓌⓍⓎⓏ
33
34 # # numbers
35 # 𝟎𝟏𝟐𝟑𝟒𝟓𝟔𝟕𝟖𝟗
36 # 𝟘𝟙𝟚𝟛𝟜𝟝𝟞𝟟𝟠𝟡
37 # 𝟢𝟣𝟤𝟥𝟦𝟧𝟨𝟩𝟪𝟫
38 # 𝟬𝟭𝟮𝟯𝟰𝟱𝟲𝟳𝟴𝟵
39 # 𝟶𝟷𝟸𝟹𝟺𝟻𝟼𝟽𝟾𝟿
40 # 0123456789
41 # ₀₁₂₃₄₅₆₇₈₉
42 # ⁰¹²³⁴⁵⁶⁷⁸⁹
43
44 # # complete lower
45 # ⒜⒝⒞⒟⒠⒡⒢⒣⒤⒥⒦⒧⒨⒩⒪⒫⒬⒭⒮⒯⒰⒱⒲⒳⒴⒵
46 # 𝔞𝔟𝔠𝔡𝔢𝔣𝔤𝔥𝔦𝔧𝔨𝔩𝔪𝔫𝔬𝔭𝔮𝔯𝔰𝔱𝔲𝔳𝔴𝔵𝔶𝔷
47 # 𝕒𝕓𝕔𝕕𝕖𝕗𝕘𝕙𝕚𝕛𝕜𝕝𝕞𝕟𝕠𝕡𝕢𝕣𝕤𝕥𝕦𝕧𝕨𝕩𝕪𝕫
48
49 # # complete upper
50 # 𝐴𝐵𝐶𝐷𝐸𝐹𝐺𝐻𝐼𝐽𝐾𝐿𝑀𝑁𝑂𝑃𝑄𝑅𝑆𝑇𝑈𝑉𝑊𝑋𝑌𝑍
51
52 # # incomplete
53 # ①②③④⑤⑥⑦⑧⑨
54 # ⑴⑵⑶⑷⑸⑹⑺⑻⑼
55 # 𐒆⒈⒉⒊⒋⒌⒍⒎⒏⒐
56 # 𝔸𝔹𝔻𝔼𝔽𝔾𝕀𝕁𝕂𝕃𝕄𝕆𝕊𝕋𝕌𝕍𝕎𝕏𝕐
57 # 𝑎𝑏𝑐𝑑𝑒𝑓𝑔𝑖𝑘𝑙𝑚𝑛𝑜𝑝𝑞𝑟𝑠𝑡𝑢𝑣𝑤𝑥𝑦𝑧
58 # 𝒶𝒷𝒸𝒹𝒻𝒽𝒾𝒿𝓀𝓁𝓂𝓃𝓅𝓆𝓇𝓈𝓉𝓊𝓋𝓌𝓍𝓎𝓏
59 # 𝒜𝒞𝒟𝒢𝒥𝒦𝒩𝒪𝒫𝒬𝒮𝒯𝒰𝒱𝒲𝒳𝒴𝒵
60 # 𝚤𝚥𝚨𝚩𝚬𝚭𝚮𝚰𝚱𝚳𝚴𝚶𝚸𝚹𝚻𝚾𝛂𝛅𝛆𝛈𝛊𝛋𝛎𝛐𝛒𝛔𝛕𝛖𝛚𝛜𝛢𝛣𝛦𝛧𝛨𝛪𝛫𝛭𝛮𝛰𝛲𝛵𝛸𝛼𝛿𝜀𝜄𝜅𝜈𝜊𝜏𝜐𝜔𝜖
61 # 𝜜𝜝𝜠𝜡𝜢𝜤𝜥𝜧𝜨𝜪𝜬𝜯𝜲𝜶𝜹𝜺𝜾𝜿𝝂𝝄𝝊𝝐𝝖𝝗𝝚𝝛𝝜𝝞𝝟𝝡𝝢𝝤𝝦𝝩𝝪𝝬
62 # 𝝰𝝴𝝸𝝹𝝼𝝾𝞃𝞄𝞊𝞐𝞑𝞔𝞕𝞖𝞘𝞙𝞛𝞜𝞞𝞠𝞣𝞤𝞦𝞪𝞬𝞮𝞲𝞳𝞶𝞸𝞺𝞽𝞾𝟆𝟊𝟋
63 # " > /dev/null
64
65 declare -A ca # associative character array
66
67 # code to generate the assignment of the ca array
68 # orig="" # "0123456789" "abcdefghijklmnopqrstuvwxyz" "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
69 # for trans in ""
70 # do
71 #     for i in $(seq 0 $((${#orig} -1)))
72 #     do
73 #         c="${orig:$i:1}"
74 #         ca[$c]+="${trans:$i:1}"
75 #     done
76 # done
77 # for i in $(seq 0 $((${#orig} -1)))
78 # do
79 #     c="${orig:$i:1}"
80 #     echo -n "ca[$c]+=\"${ca[$c]}\"; "
81 # done
82 # exit 253
83
84 # numbers
85 ca[0]+="𝟎𝟘𝟢𝟬𝟶0𐒆"; ca[1]+="𝟏𝟙𝟣𝟭𝟷1⒈"; ca[2]+="𝟐𝟚𝟤𝟮𝟸2⒉"; ca[3]+="𝟑𝟛𝟥𝟯𝟹3⒊"; ca[4]+="𝟒𝟜𝟦𝟰𝟺4⒋"; ca[5]+="𝟓𝟝𝟧𝟱𝟻5⒌"; ca[6]+="𝟔𝟞𝟨𝟲𝟼6⒍"; ca[7]+="𝟕𝟟𝟩𝟳𝟽7⒎"; ca[8]+="𝟖𝟠𝟪𝟴𝟾8⒏"; ca[9]+="𝟗𝟡𝟫𝟵𝟿9⒐"
86 # ca[0]+="₀⁰"; ca[1]+="₁¹"; ca[2]+="₂²"; ca[3]+="₃³"; ca[4]+="₄⁴"; ca[5]+="₅⁵"; ca[6]+="₆⁶"; ca[7]+="₇⁷"; ca[8]+="₈⁸"; ca[9]+="₉⁹"
87 # ca[1]+="①⑴"; ca[2]+="②⑵"; ca[3]+="③⑶"; ca[4]+="④⑷"; ca[5]+="⑤⑸"; ca[6]+="⑥⑹"; ca[7]+="⑦⑺"; ca[8]+="⑧⑻"; ca[9]+="⑨⑼"
88
89 # characters
90 ca[a]+="𝐚𝒂𝖺𝗮𝘢𝙖𝚊"; ca[b]+="𝐛𝒃𝖻𝗯𝘣𝙗𝚋"; ca[c]+="𝐜𝒄𝖼𝗰𝘤𝙘𝚌"; ca[d]+="𝐝𝒅𝖽𝗱𝘥𝙙𝚍"; ca[e]+="𝐞𝒆𝖾𝗲𝘦𝙚𝚎"; ca[f]+="𝐟𝒇𝖿𝗳𝘧𝙛𝚏"; ca[g]+="𝐠𝒈𝗀𝗴𝘨𝙜𝚐"; ca[h]+="𝐡𝒉𝗁𝗵𝘩𝙝𝚑"; ca[i]+="𝐢𝒊𝗂𝗶𝘪𝙞𝚒"; ca[j]+="𝐣𝒋𝗃𝗷𝘫𝙟𝚓"; ca[k]+="𝐤𝒌𝗄𝗸𝘬𝙠𝚔"; ca[l]+="𝐥𝒍𝗅𝗹𝘭𝙡𝚕"; ca[m]+="𝐦𝒎𝗆𝗺𝘮𝙢𝚖"; ca[n]+="𝐧𝒏𝗇𝗻𝘯𝙣𝚗"; ca[o]+="𝐨𝒐𝗈𝗼𝘰𝙤𝚘"; ca[p]+="𝐩𝒑𝗉𝗽𝘱𝙥𝚙"; ca[q]+="𝐪𝒒𝗊𝗾𝘲𝙦𝚚"; ca[r]+="𝐫𝒓𝗋𝗿𝘳𝙧𝚛"; ca[s]+="𝐬𝒔𝗌𝘀𝘴𝙨𝚜"; ca[t]+="𝐭𝒕𝗍𝘁𝘵𝙩𝚝"; ca[u]+="𝐮𝒖𝗎𝘂𝘶𝙪𝚞"; ca[v]+="𝐯𝒗𝗏𝘃𝘷𝙫𝚟"; ca[w]+="𝐰𝒘𝗐𝘄𝘸𝙬𝚠"; ca[x]+="𝐱𝒙𝗑𝘅𝘹𝙭𝚡"; ca[y]+="𝐲𝒚𝗒𝘆𝘺𝙮𝚢"; ca[z]+="𝐳𝒛𝗓𝘇𝘻𝙯𝚣"; ca[A]+="𝐀𝑨𝖠𝗔𝘈𝘼𝙰"; ca[B]+="𝐁𝑩𝖡𝗕𝘉𝘽𝙱"; ca[C]+="𝐂𝑪𝖢𝗖𝘊𝘾𝙲"; ca[D]+="𝐃𝑫𝖣𝗗𝘋𝘿𝙳"; ca[E]+="𝐄𝑬𝖤𝗘𝘌𝙀𝙴"; ca[F]+="𝐅𝑭𝖥𝗙𝘍𝙁𝙵"; ca[G]+="𝐆𝑮𝖦𝗚𝘎𝙂𝙶"; ca[H]+="𝐇𝑯𝖧𝗛𝘏𝙃𝙷"; ca[I]+="𝐈𝑰𝖨𝗜𝘐𝙄𝙸"; ca[J]+="𝐉𝑱𝖩𝗝𝘑𝙅𝙹"; ca[K]+="𝐊𝑲𝖪𝗞𝘒𝙆𝙺"; ca[L]+="𝐋𝑳𝖫𝗟𝘓𝙇𝙻"; ca[M]+="𝐌𝑴𝖬𝗠𝘔𝙈𝙼"; ca[N]+="𝐍𝑵𝖭𝗡𝘕𝙉𝙽"; ca[O]+="𝐎𝑶𝖮𝗢𝘖𝙊𝙾"; ca[P]+="𝐏𝑷𝖯𝗣𝘗𝙋𝙿"; ca[Q]+="𝐐𝑸𝖰𝗤𝘘𝙌𝚀"; ca[R]+="𝐑𝑹𝖱𝗥𝘙𝙍𝚁"; ca[S]+="𝐒𝑺𝖲𝗦𝘚𝙎𝚂"; ca[T]+="𝐓𝑻𝖳𝗧𝘛𝙏𝚃"; ca[U]+="𝐔𝑼𝖴𝗨𝘜𝙐𝚄"; ca[V]+="𝐕𝑽𝖵𝗩𝘝𝙑𝚅"; ca[W]+="𝐖𝑾𝖶𝗪𝘞𝙒𝚆"; ca[X]+="𝐗𝑿𝖷𝗫𝘟𝙓𝚇"; ca[Y]+="𝐘𝒀𝖸𝗬𝘠𝙔𝚈"; ca[Z]+="𝐙𝒁𝖹𝗭𝘡𝙕𝚉"
91 ca[a]+="a"; ca[b]+="b"; ca[c]+="c"; ca[d]+="d"; ca[e]+="e"; ca[f]+="f"; ca[g]+="g"; ca[h]+="h"; ca[i]+="i"; ca[j]+="j"; ca[k]+="k"; ca[l]+="l"; ca[m]+="m"; ca[n]+="n"; ca[o]+="o"; ca[p]+="p"; ca[q]+="q"; ca[r]+="r"; ca[s]+="s"; ca[t]+="t"; ca[u]+="u"; ca[v]+="v"; ca[w]+="w"; ca[x]+="x"; ca[y]+="y"; ca[z]+="z"; ca[A]+="A"; ca[B]+="B"; ca[C]+="C"; ca[D]+="D"; ca[E]+="E"; ca[F]+="F"; ca[G]+="G"; ca[H]+="H"; ca[I]+="I"; ca[J]+="J"; ca[K]+="K"; ca[L]+="L"; ca[M]+="M"; ca[N]+="N"; ca[O]+="O"; ca[P]+="P"; ca[Q]+="Q"; ca[R]+="R"; ca[S]+="S"; ca[T]+="T"; ca[U]+="U"; ca[V]+="V"; ca[W]+="W"; ca[X]+="X"; ca[Y]+="Y"; ca[Z]+="Z"
92 # ca[a]+="𝓪𝖆"; ca[b]+="𝓫𝖇"; ca[c]+="𝓬𝖈"; ca[d]+="𝓭𝖉"; ca[e]+="𝓮𝖊"; ca[f]+="𝓯𝖋"; ca[g]+="𝓰𝖌"; ca[h]+="𝓱𝖍"; ca[i]+="𝓲𝖎"; ca[j]+="𝓳𝖏"; ca[k]+="𝓴𝖐"; ca[l]+="𝓵𝖑"; ca[m]+="𝓶𝖒"; ca[n]+="𝓷𝖓"; ca[o]+="𝓸𝖔"; ca[p]+="𝓹𝖕"; ca[q]+="𝓺𝖖"; ca[r]+="𝓻𝖗"; ca[s]+="𝓼𝖘"; ca[t]+="𝓽𝖙"; ca[u]+="𝓾𝖚"; ca[v]+="𝓿𝖛"; ca[w]+="𝔀𝖜"; ca[x]+="𝔁𝖝"; ca[y]+="𝔂𝖞"; ca[z]+="𝔃𝖟"; ca[A]+="𝓐𝕬"; ca[B]+="𝓑𝕭"; ca[C]+="𝓒𝕮"; ca[D]+="𝓓𝕯"; ca[E]+="𝓔𝕰"; ca[F]+="𝓕𝕱"; ca[G]+="𝓖𝕲"; ca[H]+="𝓗𝕳"; ca[I]+="𝓘𝕴"; ca[J]+="𝓙𝕵"; ca[K]+="𝓚𝕶"; ca[L]+="𝓛𝕷"; ca[M]+="𝓜𝕸"; ca[N]+="𝓝𝕹"; ca[O]+="𝓞𝕺"; ca[P]+="𝓟𝕻"; ca[Q]+="𝓠𝕼"; ca[R]+="𝓡𝕽"; ca[S]+="𝓢𝕾"; ca[T]+="𝓣𝕿"; ca[U]+="𝓤𝖀"; ca[V]+="𝓥𝖁"; ca[W]+="𝓦𝖂"; ca[X]+="𝓧𝖃"; ca[Y]+="𝓨𝖄"; ca[Z]+="𝓩𝖅"
93 # ca[a]+="ⓐ"; ca[b]+="ⓑ"; ca[c]+="ⓒ"; ca[d]+="ⓓ"; ca[e]+="ⓔ"; ca[f]+="ⓕ"; ca[g]+="ⓖ"; ca[h]+="ⓗ"; ca[i]+="ⓘ"; ca[j]+="ⓙ"; ca[k]+="ⓚ"; ca[l]+="ⓛ"; ca[m]+="ⓜ"; ca[n]+="ⓝ"; ca[o]+="ⓞ"; ca[p]+="ⓟ"; ca[q]+="ⓠ"; ca[r]+="ⓡ"; ca[s]+="ⓢ"; ca[t]+="ⓣ"; ca[u]+="ⓤ"; ca[v]+="ⓥ"; ca[w]+="ⓦ"; ca[x]+="ⓧ"; ca[y]+="ⓨ"; ca[z]+="ⓩ"; ca[A]+="Ⓐ"; ca[B]+="Ⓑ"; ca[C]+="Ⓒ"; ca[D]+="Ⓓ"; ca[E]+="Ⓔ"; ca[F]+="Ⓕ"; ca[G]+="Ⓖ"; ca[H]+="Ⓗ"; ca[I]+="Ⓘ"; ca[J]+="Ⓙ"; ca[K]+="Ⓚ"; ca[L]+="Ⓛ"; ca[M]+="Ⓜ"; ca[N]+="Ⓝ"; ca[O]+="Ⓞ"; ca[P]+="Ⓟ"; ca[Q]+="Ⓠ"; ca[R]+="Ⓡ"; ca[S]+="Ⓢ"; ca[T]+="Ⓣ"; ca[U]+="Ⓤ"; ca[V]+="Ⓥ"; ca[W]+="Ⓦ"; ca[X]+="Ⓧ"; ca[Y]+="Ⓨ"; ca[Z]+="Ⓩ"
94
95 # german umlaute and ß
96 ca[ä]+="ȁǟãāæ"; ca[ö]+="őō"; ca[ü]+="űūǘǚ"
97 ca[Ä]+="ÆÃǞȀ"; ca[Ö]+="ŐŌ"; ca[Ü]+="ŰŪǗǙ"
98 ca[ß]+="ẞ"
99
100 # additional characters
101 ca[a]+="ḁ𝛂𝛼𝜶𝕒𝑎"; ca[b]+="ḃḅḇ"; ca[c]+="ḉ𝑐𝕔𝒸"; ca[d]+="ḋḍḏḑḓⅆ"
102 ca[e]+="ĕėęǝɘəḝḙẹẻẽḕḗḙḛḝ℮ℯⅇ"; ca[f]+="ḟſ𝑓"; ca[g]+="ḡ𝑔𝕘"; ca[h]+="ḣḥḧḩḫ"
103 ca[i]+="ïîíìḭịḭḯⅈ𝚤"; ca[j]+="𝕛ⅉ𝚥𝒿"; ca[k]+="ḱḳḵ𝕜𝑘"; ca[l]+="ĺɭʅḻḽ𝕝"
104 ca[m]+="ḿṁṃ"; ca[n]+="ṅṇṉṋ"; ca[o]+="ṍṑṓø"; ca[p]+="ṕṗ𝕡𝑝"
105 ca[q]+="𝕢𝓆𝑞"; ca[r]+="ṙṛṝṟ"; ca[s]+="ṡṣṥṧṩ"; ca[t]+="ṫṭṯṱ"
106 ca[u]+="ṳṵṷṹṻ"; ca[v]+="ṽṿ𝑣𝕧"; ca[w]+="ẁẃẅẇẉ"; ca[x]+="ẋẍ𝕩𝑥"
107 ca[y]+="ẏ𝑦𝕪"; ca[z]+="ẑẓẕ"
108 ca[A]+="Ḁ𝒜𝐴𝔸"; ca[B]+="ḂḄḆℬ"; ca[C]+="Ḉ𝒞𝐶"; ca[D]+="ḊḌḎḐḒⅅ𝒟"
109 ca[E]+="ℰƐḔḖḘḚḜ"; ca[F]+="ℱƑḞꜰ"; ca[G]+="Ḡ𝐺𝔾"; ca[H]+="ḢḤḦḨḪ"
110 ca[I]+="İḬḮ𝐼"; ca[J]+="𝕁𝐽"; ca[K]+="ḰḲḴ"; ca[L]+="ḶḸḺḼ"
111 ca[M]+="ḾṀṂℳ"; ca[N]+="ṄṆṈṊ"; ca[O]+="ṌṐṒ"; ca[P]+="ṔṖ𝑃"
112 ca[Q]+="𝑄"; ca[R]+="ṘṚṜṞℝ"; ca[S]+="ṠṢṤṦṨ"; ca[T]+="ṪṬ𝑇𝕋"
113 ca[U]+="ṴṶ𝒰"; ca[V]+="ṼṾ𝒱𝑉𝕍"; ca[W]+="ẀẂẄẆẈ"; ca[X]+="ẊẌ𝒳"
114 ca[Y]+="Ẏ𝒴𝕐𝑌"; ca[Z]+="ẐẒẔℤ"
115
116
117 sel1r() { # select one random character from the argument string
118     arg="$*"
119     pos="$(($RANDOM%${#arg}))"
120     echo "${arg:$pos:1}"
121 }
122
123 transform() {
124     arg="$*"
125     i='-1'
126     while [ $((++i)) -lt ${#arg} ]
127     do
128         c="${arg:$i:1}" # one character from the input string
129         rc="${ca[$c]}" # set of replace characters
130         if [ "$rc" = "" ]
131         then
132             # replace characters that cannot be used in the array $ca
133             case "$c" in
134                 "@") rc="@";;
135                 # use tr for these: "!§$%?=().:,;-_
136                 # !"#$%&'()*+,-./:;<=>?_[\]^{|}~
137                 *) rc="$c";; # no replacement defined
138             esac
139         fi
140         echo -n "$(sel1r "$rc")"
141     done
142     echo ""
143 }
144
145
146 # if files are specified use them, if nothing is specified use stdin
147 infile=""
148 if [ "$1" ]
149 then
150     while [ -f "$1" ]
151     do
152         infile="$infile $1"
153         shift
154     done
155 else
156     infile="/dev/stdin"
157 fi
158
159 # transform files or commandline arguments line by line
160 if [ -n "$infile" ]
161 then
162     cat $infile
163 else
164     echo "$*"
165 fi | while read line
166 do
167     transform "$line"
168 done
169