2017-01-02 3 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 -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 

этого решение работает на предваряя символ новой строки (маркер) к передней части слова для перевода и добавления другого символа новой строки и таблицу поиска до конца слово. Каждый символ сопоставляется со стартовым словом в поиске, а новая строка используется для обозначения того, где произошло совпадение. Соответствие прекращается, когда встречаются две новые строки. Подстановка использует флаг I для соответствия символам без содержания.

+0

Спасибо за ответ, но это работает только с одним словом, например, если бы я хотел сделать «I Love StackExchange», он напечатал бы «Indigo», а не «Indigo Lemaroscarvectorecho» и т. Д. – MaliciouZzHD

+0

Возможно, вы могли бы добавить пространство таблицы поиска? например '...:' – potong

+0

Я сделал это, но я также понял, что такие символы, как '! @ # $' И т. Д., Не работают, я пытался их вставить, но у меня были ошибки EOF – MaliciouZzHD

0

Начните с преобразования входа в верхний регистр, то s/A/альфа/и т.д. Таким образом, «P» In «альфа» не переодеться в «папа» и т.д.

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 

Вышесказанное также использует регистронезависимых матчи, так что вам не нужно двойные строки кода для обработки верхнего регистра символов. Последняя строка удаляет % s. Конечно, вы можете использовать любой символ вместо %, например. \0 или даже \n.

Вы можете попробовать его в Интернете здесь: Try it online!

P.S. Вам не нужно звонить sed 26 + разное время. Вызовите его один раз точкой с запятой или новой строкой между командами или, если хотите, несколько аргументов -e.

Смежные вопросы