Вопрос по sed, bash – Получение «ошибки sed - недопустимая последовательность байтов» (в bash) [дубликаты]

87

This question already has an answer here:

RE error: illegal byte sequence on Mac OS X 5 answers

Выполнение редактирования потока, чтобы изменить неприятный значок Parallels. Он плохо разработан и встроен в само приложение, а не в файл изображения. Итак, я нашел эту команду sed, у которой есть хорошие отзывы:

sudo sed -i.bak s/Parallels_Desktop_Overlay_128/Parallels_Desktop_Overlay_000/g /Applications/Parallels\ Desktop.app/Contents/MacOS/prl_client_app

Возвращаетсяsed: RE error: illegal byte sequence

Кто-нибудь может объяснить, что это значит? В какой части команды проблема?

Приходящие из Google: попробуйтеthis answer первый. Я захожу в эту ветку больше раз, чем хотел бы признать. Qix

Ваш Ответ

4   ответа
145

Попробуйте установитьLANG переменная окружения (LANG=C sed ...) или используйте один из двоичных инструментов sed, упомянутых здесь:двоичная замена седана

Why the error?

БезLANG=C sed предполагает, что файлы закодированы в любой кодировке, указанной вLANG и файл (будучи двоичным) может содержать байты, которые не являются допустимыми символами вLANGкодирование (таким образом, вы можете получить «недопустимую последовательность байтов»).

Why does LANG=C work?

C просто обрабатывает все символы ASCII как самих себя, а не-ASCII символы как литералы.

МнеLANG=C не работал ноLC_ALL=C сделал
Еслиbash ваша оболочка, вы можете войтиexport LANG=C и попробуй еще раз.
Отлично, но используяLC_ALL=C sed ... более надежный подход: еслиLC_ALL или жеLC_CTYPE установлены (на что-то другое, чемC), настройкаLANG не будет иметь никакого эффекта. (LC_ALL overrides все индивидуально установленные категории, если таковые имеются, тогда какLANG вступает в силу только для этих категорийnot явно установлено.)
18

Мне удалось сделать это, запустив:

unset LANG

передsed команда.

Не уверен, что я сделал или почему это работает, но это сработало.

Мне нужно было сделать вышеуказанное исправление при следовании этому уроку:projectpoppycock.com/…
@Arjan: Спасибо; Я действительно создал ответ - не на этот, а на очень похожий вопрос:stackoverflow.com/a/23584470/45375
@ mklement0, я думаю твои комментарии дают хороший ответ ...!
Это устраняет ошибку, но фактически ничего не решает для меня.
Что касается того, почему это работает: если ваша локаль была изначальноset с[export] LANG=... (в отличие от настройкиLC_ALL или настройкаLC_* категории индивидуально), затем сбросLANG делает всеLC_* категории возвращаются к"C"; заканчивая сLC_CTYPE ценностьC это то, что решает проблему. И наоборот, еслиLC_ALL или дажеLC_CTYPE специально настроены на что-то другое, чемCВаш подход не сработает.
67

LANG=C один не сделал трюк для меня, но добавивLC_CTYPE=C так же решил это.

То же самое для меня на OSX 10.8. Спасибо!
Это работало для меня на macOS Sierra
effective ценностьLC_CTYPE=C Достаточно решить проблему:LC_CTYPE=C sed ..., Однако это не сработает, еслиLC_ALL установлен (на что-то другое, чемC), потому чтоoverrides все индивидуальныеLC_* категории. Таким образом, наиболее надежный подход заключается в использованииLC_ALL=C sed ....
20

В дополнение кLANG=C а такжеLC_CTYPE=CЯ должен был сделатьLC_ALL=C чтобы заставить это работать.

LC_ALL переопределяет все индивидуальныеLC_* категории. Таким образом, наиболее надежный подход заключается в использованииLC_ALL=C sed ... - нет необходимости также иметь дело с другими переменными.

объясни немного больше, пожалуйста
Это должен быть принятый ответ. Надеюсь, вы не возражаете, я отредактировал комментарий @ mklement0 в ответ.
@rpax: На самом деле, эффективныйLC_CTYPE значение C достаточно, поэтому с помощьюLC_CTYPE=C sed ... (непосредственно перед командой-нарушителем)normally достаточно,unless LC_ALL - которыйoverrides все индивидуальныеLC_* категории - было установлено. Таким образом, наиболее надежный подход заключается в использованииLC_ALL=C sed ... - нет необходимости также иметь дело с другими переменными.
@Qix: мой вклад был добавлен какcomment потому что я посчитал это слишком инвазивным для редактирования: ваше редактирование сводится к тому, чтобы поместить слова в рот @ r, jpeter2, и в его нынешнем виде дает несколько противоречивый ответ. Обратите внимание, что я рекомендовалLC_ALL=C sed ... подход в комментарияхall ответы на этой странице, включая принятый в настоящее время. Для полной картины, я предлагаю проконсультироваться с моимown answer на дубликат вопроса.

Похожие вопросы