Нельзя использовать одинарные кавычки в строке с одинарными кавычками.
Вместо этого используйте двойные кавычки вокруг выражения sed
:
sed -i "s/ENCRYPTION='Y'/ENCRYPTION='N'/g"
Я сомневаюсь, что это волшебным образом расшифрует ваши данные, но по крайней мере строки в файле будут заменены так, как вы, вероятно, и предполагали.
Ваша исходная команда пыталась заменить ENCRYPTION=Y
наENCRYPTION=N
(обратите внимание на отсутствующие одинарные кавычки ). Это связано с тем, что начальная одинарная кавычка в 'Y'
заканчивает строку s/ENCRYPTION=
. Затем вы объединяете Y
без кавычек с этим, за которым следует строка /ENCRYPTION=
в одинарных кавычках, за которой следует N
без кавычек и строка /g
в одинарных кавычках.
У меня есть краткое объяснение &&
и ||
в этом ответе :https://unix.stackexchange.com/a/31881/4506m, но вот более подробное объяснение ваших конкретных примеров.
Во-первых, важно знать, что команды unix либо завершаются успешно , либо завершаются неудачно , независимо от того, какой результат они могут выдать или не выдать. Точнее, команда завершается успешно, если ее статус выхода равен нулю, и терпит неудачу, если она имеет статус выхода, отличный от -нулевой, но мышление с точки зрения статусов выхода сбивает с толку.
Учитывая это, вы могли бы подумать о
cmd1 && cmd2 &&... && cmdN
как оценивание команд слева направо до тех пор, пока одна из них не даст сбой, и cmd1 || cmd2 ||... && cmdN
как оценивание команд слева направо до тех пор, пока одна из них не будет успешной. Итак, начнем с вашего первого примера
echo 1 && false && echo 2 || echo 3
Это становится немного более запутанным из-за объединения операций &&
и ||
без круглых скобок, что делает предполагаемую группировку неясной. Оказывается, &&
и ||
имеют одинаковый приоритет и группу слева, но подобные смешанные последовательности часто сбивают с толку. Точное значение этого выражения
( ( ( echo 1 && false ) && echo 2 ) || echo 3 )
Хорошо, что здесь происходит?
Оболочка начинает вычислять (... || echo 3 )
, но для этого она должна сначала обработать левую команду.
Оболочка начинает вычислять (... && echo 2 )
, но для этого она должна сначала обработать левую команду.
Оболочка начинает вычислять ( echo 1 && false )
, но для этого она должна сначала обработать левую команду.
Оболочка оценивает echo 1
, что всегда будет успешным, т. е. выход с нулевым кодом состояния. Тот факт, что echo 1
тоже что-то печатает, не имеет отношения к оператору &&
, но объясняет первую строку вашего вывода, 1\n
.
Левый операнд первого ( echo 1 && false )
удалось,поэтому оболочка продолжает вычислять правильный операнд, false
. Это команда, которая всегда терпит неудачу, и поэтому выражение &&
в целом терпит неудачу.
Левый операнд (... && echo 2 )
уже дал сбой, поэтому оболочка не выполняет echo 2
, и само это выражение завершается ошибкой.
Сбой левого операнда (... || echo 3 )
, поэтому оболочка выполняет echo 3
. Эта команда выводит вторую строку вывода, но, что более важно для оператора ||
, echo
всегда выполняется успешно, поэтому вся последовательность операторов &&
и ||
выполняется успешно.
Если после выполнения команды вы набрали echo $?
, вы увидите нулевое значение, указывающее на то, что предыдущая команда выполнена успешно.
Второй пример можно оценить с помощью того же процесса, описанного выше, но давайте рассмотрим его подробно.
echo 2 || echo 3
Это намного проще, чем ваш первый пример. Оболочка проходит следующие этапы.
Оболочка начинает вычислять echo 2 || echo 3
, но для этого она должна сначала оценить левую часть.
Оболочка оценивает echo 2
. Это напечатает вашу одну выходную строку и преуспеет.
Оболочка продолжает вычисление echo 2 || echo 3
, за исключением того, что теперь, поскольку левая рука выполнена успешно, правила ||
гласят, что правая часть вообще не оценивается (, и, следовательно, вы не получаете еще одну строку вывода ). Поскольку левая часть выполнена успешно, все выражение ||
выполнено успешно.
Это довольно подробно, но я надеюсь, что это поможет.
Оболочка выполняет команды в строгом порядке слева направо (для списков ИЛИ и И ).
В этой команде:
echo 1 && false && echo 2 || echo 3
Первая команда — echo 1
. Он выполняется, и статус выхода становится 0
(, даже если он уже был 0 в начале ), поскольку статус выхода эха всегда 0
.
Когда первый &&
найден, статус выхода равен 0 (сверху ), что означает, что выполнение было успешным, тогда &&
принимается и выполняется следующая команда.
При выполнении false
статус выхода становится 1 (сбой ).
При обнаружении следующего &&
текущий статус выхода равен 1, &&
отклоняется, а следующая команда(echo 2
)не выполняется.
Но в строке еще больше кода, поэтому оболочка переходит к следующему элементу, ||
. Будучи текущим статусом выхода 1
в этот момент, ||
принимается и выполняется следующая команда (echo 3
).
Команду echo 2 || echo 3
очень легко проанализировать. Первая команда выполняется (всегда ), чтобы получить код выхода. Этот код выхода — 0
, следующий ||
отклоняется, а echo 3
не выполняется. Больше нечего обрабатывать, конец строки.