У меня есть файлы JSON, аннотированные комментариями, которые я удаляю перед выполнением операций с использованием jq
. Я просто поразил интересную проблему, в которой я получил JSON-файл с комментариями комментариев, который включал некоторые символы кавычек с богатым текстом (hex 93 и hex 94). Мой существующий символ sed .
не соответствовал этим символам. Вот демонстрация:Должно ли LC_ALL = C Всегда использоваться для операций с нелокальным концом?
Во-первых, вход:
% echo -e '# \x93text\x94\n{"a":1}' | od -c
0000000 # 223 t e x t 224 \n { " a " : 1 }
0000020 \n
0000021
%
А вот преобразование:
% echo -e '# \x93text\x94\n{"a":1}' | sed 's/^\s*#.*//' | od -c
0000000 223 t e x t 224 \n { " a " : 1 } \n
0000017
%
Обратите внимание, что символ точки в SED выражения не соответствует символ гекс 93 , Однако, если я включаю LC_ALL=C
:
% echo -e '# \x93text\x94\n{"a":1}' | LC_ALL=C sed 's/^\s*#.*//' | od -c
0000000 \n { " a " : 1 } \n
0000011
%
затем символ точки в СЕПГ выражении это соответствует символы с шестигранной 93 и шестигранный 94. Раздел документации sed Locale Considerations говорит о выражениях в скобках, но вышеприведенное поведение, похоже, доказывает, что эта проблема происходит в другом месте.
Интересно отметить, что удаление вместо подстановки не показывать эту проблему:
% echo -e '# \x93text\x94\n{"a":1}' | sed '/^\s*#.*/d' | od -c
0000000 { " a " : 1 } \n
0000010
Учитывая, что я работающий на аннотированных файлов в формате JSON, я думаю, что решение о добавлении LC_ALL=C
к SED утверждений разумный.
Итак, мой вопрос: Пользуется LC_ALL=C
то, что я всегда хочу, чтобы использовать при выполнении, не локализированных sed
преобразования (как это было бы применимо в аннотированных файлов в формате JSON)? Если нет, то какие существуют альтернативы, чтобы избежать проблемы, которую я показал выше?
Моя среда:
- CentOS 7.3 [ядро-3.10.0-514.6.1.el7.x86_64]
- СЭД (GNU СЭД) 4.2.2 [SED-4.2.2-5. el7.x86_64]
- Bash 4.2.46 (1) [Баш-4.2.46-21.el7_3.x86_64]
не проблема под KSH (среда cerftainly разные), но пытается ваша строка я получаю, что может помочь «echo -e» # \ x93text \ x94 \ n {"a": 1} '| sed '/^[[:space:]]*#.*/ s // [ЗДЕСЬ] /' | od -c' дать '0000000 [ЗДЕСЬ] 223 текст 224 \ n {" a 0000020 ": 1} \ n ' so sed оценивается на замену, что конец линии достигнут, а не в выборе – NeronLeVelu
@NeronLeVelu да, это очень нечетное поведение в любом случае. Поскольку веб-страница sed предлагает включать в себя «LC_ALL = C», мне остается задаться вопросом, является ли это обходным путем для ошибки в sed, или если это сложная для понимания функция. –