SED дает сбой в MacOS в двух случаях: неверное количество повторений и неправильный флаг в команде замены - PullRequest
0 голосов
/ 21 ноября 2018

Я пытаюсь создать серию кроссплатформенных замен 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

1 Ответ

0 голосов
/ 02 декабря 2018

Скопировал ответ из моего обновления выше.

Я определил источник проблем выше.В обратном порядке: 1) Последняя замена не была проблемой sed, но вместо этого более ранняя строка в моем скрипте, которая выполняла wc (подсчет слов) для определения N_HASH_CHARS, заканчивалась только предшествующими пробелами только в macOS.Обрезка пробелов решила проблемы с помощью второй команды sed выше 2) Первое приведенное выше выражение sed фактически было проблемой совместимости между BSD sed и Linux sed.В другом месте в stackoverflow я обнаружил, что списки встроенных функций в BSD, использующие {}, должны иметь внутренний список функций, заканчивающийся на;Выкладываю;сразу после g для глобальной замены проблема решена и работает как для Linux, так и для macOS

...