Можно ли использовать tr с содержимым файла?

Я пытаюсь зашифровать текст, так что у меня этот файл шифрует a-z и A-z для разных наборов алфавита.

#!/bin/bashcode

encrypted=$1
message=$2

cat $message | tr "[a-z][A-Z]" "encrypted"

но это дает мне странный набор. Что я делаю неправильно?

минимальный воспроизводимый пример принесет здесь много пользы. «Вот как я вызываю сценарий, это результат, который я получаю, и это результат, который я ожидаю» было бы легче проверить, чем просто обсудить, является ли что-то «странным». (Если ваш вывод содержит только символы из слова encrypted ... ну, это именно то, что можно было бы ожидать от этого кода).

Charles Duffy 14.09.2018 22:55

Кстати, обратите внимание, что значение [a-z][A-Z] очень зависит от локали, и если ваш код запускается в локали, где порядок сортировки похож на AaBbCc...Zz, а не на ABC...Zabc...z или abc...zABC...Z, вы получите удивительные результаты.

Charles Duffy 14.09.2018 22:56

(Или вы хотите, чтобы "$encrypted" фактически использовал переменную, которую вы назначили в предыдущей строке? Или "$(<"$encrypted")", чтобы прочитать файл, указанный в этой переменной, и заменить его содержимое? не знаю, что вы хотеть этот код делать).

Charles Duffy 14.09.2018 22:58

Я почти уверен, что вы ищете < "$message" tr "[a-z][A-Z]" "$(cat "$encrypted")"

William Pursell 14.09.2018 23:02

Но «зашифрованный» кажется неправильным названием для вашего шифра.

William Pursell 14.09.2018 23:03

@WilliamPursell Большинство tr не требует [] для диапазонов - особенно GNU tr (gnu.org/software/coreutils/manual/html_node/…).

Benjamin W. 14.09.2018 23:03

@CharlesDuffy, что вы имеете в виду под термином «зависящий от локали»? Я хочу использовать зашифрованную переменную вместо того, чтобы жестко кодировать то, что зашифровано

lolads 14.09.2018 23:04

@WilliamPursell Я пробовал это, но это дало мне ошибку, поэтому я просто двинулся дальше ... может я что-то напечатал не так

lolads 14.09.2018 23:07

@lolads, то, что я имею в виду под "зависящим от локали", заключается в том, что значение зависит от языковых настроек вашей системы. В разных частях света действуют разные правила сортировки букв перед другими, и такие выражения, как A-Z, подчиняются этим правилам. Если вы хотите, чтобы ваш код вел себя единообразно везде, вы пишете все буквы в том порядке, в котором они вам нужны.

Charles Duffy 14.09.2018 23:11

@CharlesDuffy а, это правда, но когда я погуглил о tr, мне показалось, что [a-z] [A-Z] довольно распространены. Разве это не значит, что все буквы от a до z и заглавные буквы от A до Z?

lolads 14.09.2018 23:12

Он широко используется в большинстве англоязычных стран, но все же есть места, где он ломается. Такое широко распространенное использование антипаттернов - пример того, почему доверять Google иногда неразумно.

Charles Duffy 14.09.2018 23:13

Экспорт LC_COLLATE=C поможет смягчить последствия, указав конкретный известный порядок сортировки.

Charles Duffy 14.09.2018 23:16

Позвольте нам продолжить обсуждение в чате.

lolads 14.09.2018 23:16
Вопросы, требующие помощи по отладке («почему этот код не работает?»), Должны включать в себя желаемое поведение, конкретную проблему или ошибку и кратчайший код, необходимый для их воспроизведения в самом вопросе. Вопросы без четкой постановки проблемы не будут полезны другим читателям. См .: Как создать минимальный, полный и проверяемый пример.
jww 14.09.2018 23:49
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
14
115
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

У вас должно быть однозначное соответствие символов в tr:

cat $message | tr "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" "qwertyuioplkjhgfdsazxcvbnmMNBVCXZASDFGHJKLPOIUYTREWQ"

да, это то, что я сделал, но я не думаю, что это самый эффективный способ

lolads 14.09.2018 23:02
<"$message" будет менее глючным, чем cat $message. Даже cat "$message" был бы улучшением.
Charles Duffy 14.09.2018 23:10

@CharlesDuffy Я использую cat, потому что хочу увидеть результат на своем терминале. не <перенаправляет вывод в файл?

lolads 14.09.2018 23:14

@CharlesDuffy Я чувствую, что кодирую жестко?

lolads 14.09.2018 23:14

@lolads, <"$message" ... настраивает stdin для ..., чтобы он поступал прямо из файла, тогда как cat "$message" | ... настраивает stdin для ..., чтобы он поступал из копии cat, которая читает из файла, поэтому у вас есть программа (cat), сидящая между файлом и экземпляр tr. Такой вид косвенного обращения означает, что программа (... в нашем примере выше) не имеет прямого доступа к файлу - она ​​не может спросить, сколько времени это длится, не прочитав до конца, чтобы попытаться увидеть, например , потому что только cat имеет дескриптор самого файла.

Charles Duffy 14.09.2018 23:17

это не безопасное шифрование, а просто для развлечения

$ function rot13() { tr 'A-Za-z' 'N-ZA-Mn-za-m'; }

$ echo "Et tu, Brute?" | rot13
Rg gh, Oehgr?

$ echo "Et tu, Brute?" | rot13 | rot13
Et tu, Brute?

13, очевидно, составляет половину длины алфавита, поэтому и шифрование, и дешифрование используют одно и то же преобразование; один из видов шифра Цезаря.

Другие вопросы по теме