2017-01-02 14 views
0

Ich mache derzeit eine sehr einfache Kryptografie-Tool, mit dem Linux-Befehl sed.Sed Ersetzen für Kryptographie

Ich habe ein Problem, wenn ...

Hier ist mein Code:

#!/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' 

Und wenn ich es ausführen und Input setzen, das ist die Ausgabe:

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

Wenn Es sollte (basierend auf Australien Phonetik)

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

Hat jemand eine Lösung dafür?

Antwort

2

Diese könnte für Sie arbeiten (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 

Diese Lösung durch ein voran~~POS=TRUNC eine neue Zeile (Marker) auf die Vorderseite des Wortes arbeitet eine andere newline übersetzt werden und Anhänge und eine Lookup-Tabelle des zu Ende Wort. Jedes Zeichen wird mit einem Anfangswort in der Suche verglichen und die neue Zeile wird verwendet, um zu markieren, wo die Übereinstimmung aufgetreten ist. Die Übereinstimmung wird beendet, wenn zwei neue Zeilen gefunden werden. Die Substitution verwendet das Flag I, um auf hüllenlose Zeichen zu passen.

+0

Danke für die Antwort, aber das funktioniert nur mit einem Wort, zB wenn ich "I Love StackExchange" machen wollte, würde es nur "Indigo" drucken, nicht "Indigo Lemaroscarvectorecho" etc ... – MaliciouZzHD

+0

Vielleicht könnten Sie hinzufügen ein Leerzeichen an die Lookup-Tabelle? z.B. '...:' – potong

+0

Ich habe das getan, aber ich habe auch festgestellt, dass Zeichen wie '! @ # $' Etc nicht funktionieren, habe ich versucht, sie in, aber ich habe 'EOF' Fehler – MaliciouZzHD

0

Beginnen Sie mit der Eingabe in Großbuchstaben umzuwandeln, dann s/A/alpha/usw. diese Weise wird die "P" in "Alpha" zu nicht umziehen "Papa" usw.

1

Potongs Nachschlagetabelle ist ordentlich. Eine einfachere, aber auch längere Lösung besteht darin, jedes Zeichen zuerst mit einem Begrenzer zu versehen, der nicht im Klartext erscheint, z. s/./%&/g, die Ihren String in %S%t%a%c%k... verwandelt. Dann statt S passenden, werden Sie %S entsprechen:

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 

Die oben verwenden auch Groß- und Kleinschreibung Übereinstimmungen, so dass Sie nicht die doppelten Codezeilen müssen Großbuchstaben zu handhaben. Die letzte Zeile entfernt die % s. Natürlich können Sie ein beliebiges Zeichen anstelle von %, z.B. \0 oder sogar \n.

Sie können es versuchen, hier online: Try it online!

P. S. Sie müssen nicht sed 26+ separate Zeiten aufrufen. Rufen Sie es einmal mit einem Semikolon oder einer neuen Zeile zwischen Befehlen auf, oder wenn Sie möchten, mehrere -e Argumente.