Я пытаюсь создать серию кроссплатформенных замен SED (Linux и MacOS).Я получаю две ошибки на MacOS для двух приведенных ниже команд SED, которые прекрасно работают под bash в Linux.Что мне нужно изменить, чтобы они принимались в соответствии с SED в стиле BSD?
Примечание. В каждой приведенной ниже команде $ sed_regex_sym заменяется на -r для Linux и -E для macOS.
sed -$sed_regex_sym "/.*[*]/!{/.*[|]{1}/s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[mGK]([_|\\\/])\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[mGK]/\3/g}"
sed -$sed_regex_sym "/^([[:space:]_|\\\/]{0,$N_HASH_CHARS})[A-Z][[:space:]]/s/([A-Z][[:space:]].{1,${N_STAT_CHARS_TO_KEEP}}).*/$(printf "%${N_STAT_INDENT_CHARS}s" " ")\1/"
Для двух приведенных выше команд я получаю следующие две ошибки соответственно:
sed: 1: "/.*[*]/!{/.*[|]{1}/s/\x ...": bad flag in substitute command: '}'
sed: 1: "/^([[:space:]_|\\/]{0, ...": RE error: invalid repetition count(s)
Для последней замены я попытался избежать скобки для групп совпадений , как я видел надругое сообщение, но это не помогло решить проблему с недопустимым числом повторений.
Обновление от 01.12.2008: Я определил источник проблем, описанных выше.В обратном порядке:
1) Последняя подстановка на самом деле не была проблемой sed, но вместо этого более ранняя строка в моем скрипте, которая выполняла wc (подсчет слов) для определения N_HASH_CHARS, заканчивалась только предшествующими пробелами только в macOS.Обрезка пробелов решила проблемы с помощью второй команды sed, приведенной выше
2) Первое приведенное выше утверждение sed фактически было проблемой совместимости между BSD sed и Linux sed.В другом месте в stackoverflow я обнаружил, что списки встроенных функций в BSD, использующие {}, должны иметь конец внутреннего списка функций с;
Putting a;сразу после g для глобального замещения проблема решена и работает как для Linux, так и для macOS