Проблема преобразования кода Морзе в текст с использованием sed - PullRequest
0 голосов
/ 09 февраля 2020

Я новичок в сценариях bash, так что терпите меня.

У меня есть задача преобразовать текст в азбуку Морзе и наоборот из заданного файла .txt. Я успешно выполнил первую часть, но когда я пытаюсь запустить второй скрипт для перевода с морзе на текст, я получаю эту ошибку:

  sed: can't read s/.-/A/g: No such file or directory
  S

Мой оригинальный код:

#!/bin/bash

sed 's/.-/A/g' -e 's/-.../B/g' -e 's/-.-./C/g' -e 's/-../D/g' -e 's/./E/g' -e 's/..-./F/g' -e 's/- 
-./G/g' -e 's/..../H/g' -e 's/../I/g' -e 's/.---/J/g' -e 's/-.-/K/g' -e 's/.-../L/g' -e 's/--/M/g' -e 
's/-./N/g' -e 's/---/O/g' -e 's/.--./P/g' -e 's/--.-/Q/g' -e 's/.-./R/g' -e 's/.../S/g' -e 's/-/T/g' 
-e 's/..-/U/g' -e 's/...-/V/g' -e 's/.--/W/g' -e 's/-..-/X/g' -e 's/-.--/Y/g' -e 's/--../Z/g' -e 
's/...../1/g' -e 's/....-/2/g' -e 's/...--/3/g' -e 's/....-/4/g' -e 's/...../5/g' -e 's/-..../6/g' -e 
's/--.../7/g' -e 's/---../8/g' -e 's/----./9/g' -e 's/-----/0/g' Morse_Text.txt

The Morse_Text TXT-файл:

-- --- .-. … . -.- --- -.-. .

Ответы [ 2 ]

0 голосов
/ 09 февраля 2020

Вы должны убедиться, что самые большие совпадения заменяются первыми.
Удобно хранить команды в morse.sed следующим образом:

s/-----/0/g
s/\.\.\.\.\./5/g
s/\.\.\.\.\./1/g
s/\.\.\.\.-/4/g
s/\.\.\.\.-/2/g
s/\.\.\.--/3/g
s/-\.\.\.\./6/g
s/--\.\.\./7/g
s/---\.\./8/g
s/----\./9/g
s/\.\.\.\./H/g
s/\.\.\.-/V/g
s/\.\.-\./F/g
s/\.-\.\./L/g
s/\.--\./P/g
s/\.---/J/g
s/-\.\.\./B/g
s/-\.\.-/X/g
s/-\.-\./C/g
s/-\.--/Y/g
s/--\.\./Z/g
s/--\.-/Q/g
s/\.\.\./S/g
s/\.\.-/U/g
s/\.-\./R/g
s/\.--/W/g
s/-\.\./D/g
s/-\.-/K/g
s/--\./G/g
s/---/O/g
s/\.\./I/g
s/\.-/A/g
s/-\./N/g
s/--/M/g
s/\./E/g
s/-/T/g

Теперь вы можете использовать

sed -Ef morse.sed Morse_Text.txt
0 голосов
/ 09 февраля 2020

Вы должны экранировать (добавить \) символы ., поскольку они имеют особое значение в регулярных выражениях.

Как это sed 's/\.-/A/g

Посмотрите в https://en.wikipedia.org/wiki/Regular_expression

Также вы пропускаете первый -e после вашей команды sed:

░ tamasgal@greybox.local:~
░ 16:37:45 > echo '... --- ...'| sed -e 's/\.\.\./S/g' -e 's/---/O/g'
S O S

Кстати. вы столкнетесь с большим количеством проблем из-за того, что sed работает, он заменит части других азбуок Морзе на этапах.

Вы должны рассмотреть возможность добавления начального пробела или новой строки после каждой группы команды Морзе.

Вот пример поэтапного (декодирование SOS9):

░ tamasgal@greybox.local:~
░ 16:43:47 > echo '... --- ... ----.'| sed -e 's/\.\.\./S/g'
S --- S ----.

░ tamasgal@greybox.local:~
░ 16:43:56 > echo '... --- ... ----.'| sed -e 's/\.\.\./S/g' -e 's/---/O/g'
S O S O-.

░ tamasgal@greybox.local:~
░ 16:44:00 > echo '... --- ... ----.'| sed -e 's/\.\.\./S/g' -e 's/---/O/g' -e 's/----\./9/g'
S O S O-.

Одним из решений является включение символа пробела или конца строки ($) для каждой группы, например:

░ tamasgal@greybox.local:~
░ 16:44:02 > echo '... --- ... ----. '| sed -e 's/\.\.\.[ $]/S/g' -e 's/---[ $]/O/g' -e 's/----\.[ $]/9/g'
SOS9

Кстати. это безобразное решение, но я не буду делать твою домашнюю работу;)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...