Sed преобразование строки подчеркивания в CamelCase завершается неудачно на числах - PullRequest
0 голосов
/ 14 октября 2019

У меня есть задание для преобразования имен функций, написанных так: function_name () в camelCase. Существуют некоторые ограничения:

  • не конвертировать функции с заглавными буквами
  • не конвертировать часть функции с двумя подчеркиваниями (two__underscores ())

Я подумал о команде sed, которая работает довольно хорошо, за исключением того, что она не работает на одной цифре между подчеркиванием:

команда:

sed -re '/[A-Z]+/!s/([0-9a-z])(_)([a-z0-9])/\1\u\3/g'

Что она делает:

  • this_is_simple () -> thisIsSimple ()
  • this_is_2_simple () -> thisIs2_simple ()
  • this_is_22_simple () -> thisIs22Simple ()
* 1023 проблемаэто второй пример. Почему происходит сбой на одной цифре, а не на числе с большим количеством цифр? Я попытался использовать [[: digit:]] и заменить ([0-9a-z]) на ([a-z0-9] | [[: digit:]]). Они работают одинаково.

Заранее спасибо.

1 Ответ

0 голосов
/ 14 октября 2019

Переберите его вручную и заменяйте до тех пор, пока не будет ничего заменить.

sed -re '/[A-Z]+/!{ : again; /([0-9a-zA-Z])_([a-z0-9])/{ s//\1\u\2/; b again; }; }'

Я добавил A-Z в первом регулярном выражении для обработки таких случаев, как:

this_is_a_simple -> thisIsASimple

После первого совпадения оно становится thisIsA_simple, поэтому во втором цикле мы хотим сопоставить A_simple.

Возможно, лучшей версией будет:

sed -re '/[A-Z]+/!{ : again; /(.*[0-9a-z])_([a-z0-9])/{ s//\1\u\2/; b again; }; }'

Поскольку регулярное выражение является жадным, это заменится с конца, поэтому this_is_a_simple сначала становится this_is_aAimple, затем this_isASimple, затем thisIsASimple.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...