2017-01-02 18 views
0

我目前正在使用Linux命令sed制作一个非常简单的加密工具。sed取代密码学

我也确实存在一个问题...

这里是我的代码:

#!/bin/bash 
echo -n "String } " 
read String 
echo $String | sed -e 's/a/alpha/g' | sed -e 's/b/bravo/g' | 
sed -e 's/c/charlie/g' | sed -e 's/d/delta/g' | sed -e 's/e/echo/g' | 
sed -e 's/f/foxtrot/g' | sed -e 's/g/golf/g' | sed -e 's/h/hotel/g' | 
sed -e 's/i/indigo/g' | sed -e 's/j/juliet/g' | sed -e 's/k/kilo/g' | 
sed -e 's/l/lemar/g' | sed -e 's/m/mike/g' | sed -e 's/n/november/g' | 
sed -e 's/o/oscar/g' | sed -e 's/p/papa/g' | sed -e 's/q/quebec/g' | 
sed -e 's/r/romeo/g' | sed -e 's/s/sierra/g' | sed -e 's/t/tango/g' | 
sed -e 's/u/uniform/g' | sed -e 's/v/vector/g' | sed -e 's/w/whiskey/g' | 
sed -e 's/x/x-ray/g' | sed -e 's/y/yankee/g' | sed -e 's/z/zulu/g' | 
sed -e 's/A/Alpha/g' | sed -e 's/B/Bravo/g' | sed -e 's/C/Charlie/g' | 
sed -e 's/D/Delta/g' | sed -e 's/E/Echo/g' | sed -e 's/F/Foxtrot/g' | 
sed -e 's/G/Golf/g' | sed -e 's/H/Hotel/g' | sed -e 's/I/Indigo/g' | 
sed -e 's/J/Juliet/g' | sed -e 's/K/Kilo/g' | sed -e 's/L/Lemar/g' | 
sed -e 's/M/Mike/g' | sed -e 's/N/November/g' | sed -e 's/O/Oscar/g' | 
sed -e 's/P/Papa/g' | sed -e 's/Q/Quebec/g' | sed -e 's/R/Romeo/g' | 
sed -e 's/S/Sierra/g' | sed -e 's/T/Tango/g' | sed -e 's/U/Uniform/g' | 
sed -e 's/V/Vector/g' | sed -e 's/W/Whiskey/g' | sed -e 's/X/X-ray/g' | 
sed -e 's/Y/Yankee/g' | sed -e 's/Z/Zulu/g' 

当我执行它,并把输入,这是输出:

[email protected]:~# ./String2Phonetic 
String } StackOverflow 
SierratangoalemikearomeopapahosierracaromeotangoelemikearomeoachosierracaromeotangoelemikearomeoaromeolemikearomeoinosierracaromeovectoremberomeodigosierracaromeoechosierracaromeotangoelemikearomeoosierracaromeokilemikearomeoosierracaromeoOscarvectorechosierracaromeotangoelemikearomeoosierracaromeoromeofosierracaromeoxrayankeetangoromeoosierracaromeotangolemikearomeoosierracaromeowhiskeyankee 
[email protected]:~# 

当它应该是(基于澳大利亚语音)

[email protected]:~# ./String2Phonetic 
String } StackOverflow 
SierratangoalphacharliekiloOscarvectorechoromeofoxtrotlemaroscarwhiskey 

有没有人有此修复?

回答

2

这可能会为你工作(GNU SED):

sed -r 's/.*/\n&\n:alpha:bravo:charlie:delta:echo:foxtrot:golf:hotel:indigo:juliet:kilo:lemur:mike:november:oscar:papa:quebec:romeo:sierra:tango:uniform:vector:whiskey:x-ray:yankee:zulu/;:a;s/\n([^\n])(.*\n.*:\1([^:]*))/\1\3\n\2/I;ta;s/\n.*//' file 

此解决方案由一个前缀一个换行符(标记)这个词的前面进行翻译,追加另一换行和查找表的末尾字。每个字符都与查找中的起始字词相匹配,换行符用于标记匹配发生的位置。匹配在遇到两条换行符时终止。 Substitution使用I标志来匹配无格式字符。

+0

感谢您的回复,但这只适用于一个字,例如,如果我想要做“我爱StackExchange”,它只会打印“Indigo”,而不是“Indigo Lemaroscarvectorecho”等等。 – MaliciouZzHD

+0

也许你可以添加查找表的空间?例如'...:' – potong

+0

我已经这样做了,但是我也意识到像'!@#$'等字符不起作用,我试图将它们放入,但是当您遇到'EOF'错误 – MaliciouZzHD

0

开始将输入到大写,则S/A /阿尔法/等 这样的“P的”,在“阿尔法”没有得到修改为“爸爸”等

1

波东的查找表是整洁的。一个更简单但更长的解决方案是首先为每个字符加上一个不出现在明文中的定界符,例如, s/./%&/g,这会将您的字符串变成%S%t%a%c%k...。然后,而不是匹配S,你会匹配%S

s/./%&/g 
s/%a/&lpha/gi 
s/%b/&ravo/gi 
s/%c/&harlie/gi 
s/%d/&elta/gi 
s/%e/&cho/gi 
# ... 
s/%y/&ankee/gi 
s/%z/&ulu/gi 
s/%//g 

上面也使用不区分大小写的比赛,所以你不需要双击代码行来处理大写字符。最后一行删除了%。当然,您可以使用任何字符代替%,例如\0或甚至\n

你可以在这里在线尝试:Try it online!

附:您无需拨打sed 26个不同的时间。在命令之间用分号或换行符调用一次,或者,如果您愿意,可以使用多个参数-e