Как изменить все строки в файле python от snake_case до camelCase в sed

Я пробовал некоторые sed шаблоны, подобные этому из командной строки

sed -r "s/('[az]+)_([az])([az]+)/\1\U\2\L\3/" 

Но почему-то это не работает. Во-первых, они забыли цифры, которые я могу исправить, но этот шаблон работает только для одного подчеркивания. Так, например, если у меня есть строка в файле

'Foo_bar_foo'

он преобразуется в

'FooBar_foo'

, Что не то, что я хочу (хочу 'fooBarFoo' )

Я хочу только изменить строки в файле, а не имена переменных или что-то еще. Так, например, это

 delta_limits=Limits(general_settings['signal_lower_limit'] 

Должно стать этим

 delta_limits=Limits(general_settings['signalLowerLimit'] 

  • оценивать несколько шаблонов из вывода программы и записывать в определенные шаблоны файлы
  • bash - Разделить значения «таблицы» в строки в массиве
  • Как свернуть 'grep -c <токен> * .h * .cpp' в один счет?
  • sed предотвращает удаление остальной линии
  • Вставьте новые строки с отсутствующими значениями (NA)
  • Обратная последовательность файла с инструментами POSIX?
  • Управление дублированными строками в файлах
  • Как мне искать файл для строки, а затем использовать его как переменную?
  • 2 Solutions collect form web for “Как изменить все строки в файле python от snake_case до camelCase в sed”

    Если я правильно понимаю, вы хотите изменить _x на X если это происходит внутри строк '...' .

    Затем с помощью GNU sed вы можете сделать следующее:

     sed -E ":1;s/^(([^']|'[^']*')*'[^']*)_([^'])/\1\u\3/;t1" 

    Это заменяет _X следующим '... сам, следуя последовательности не кавычек или совпадающих кавычек.

    Что на входе вроде:

     foo_bar 'ab_cd_ef gh_ij' zz_zz 'aa_bb'' delta_limits=Limits(general_settings['signal_lower_limit'] 

    дает:

     foo_bar 'abCdEf ghIj' zz_zz 'aaBb' delta_limits=Limits(general_settings['signalLowerLimit'] 

    Это предполагает, что у вас нет строк, вставляющих одинарные кавычки (как в 'foo\'bar' ). Если это так, вам нужно будет учитывать эти экраны с помощью:

     sed -E ":1;s/^(([^']|'([^\']|\\\\.)*')*'([^\']|\\\\.)*)_([^'])/\1\u\5/;t1" 

    (также учитывается 'foo\\' ).

    Это все еще не охватывает "foo'bar" или строки с обратной косой чертой или « python's '''it's a multi-line quote''' . Вам понадобится парсер python который сможет охватить все случаи.

    Для вашего конкретного случая,

     sed -E ":1;s/('\w*)_(\w)/\1\u\2/g;t1" 

    Также может быть достаточно (заменяет только _X который следует '\w* ). Это эквивалент GNU sed (за исключением того, что точно соответствует \w ) подхода Glenn perl .

    Я бы использовал perl для этого:

     perl -pe "1 while s/('\w+)_([^']*)/\$1\\u\$2/" <<END my_variable = 'a_string_with_snake_case_inside' delta_llimits=Limits(general_settings['signal_lower_limit'] END 
     my_variable = 'aStringWithSnakeCaseInside' delta_limits=Limits(general_settings['signalLowerLimit'] 

    Это означает: пока поиск и замена продолжают находить совпадение «1» (нет-op, который возвращает true)

    Interesting Posts

    Декодировать двоичный вывод из программы Fortran, созданной в системе Sun Sparc

    У Solaris есть эквивалент /etc/ld.so.conf?

    Fingerprint-GUI работает только как root?

    Как открыть порт в начале процесса загрузки, чтобы разблокировать LUKS через SSH

    Двухканальные мониторы Gentoo

    Что такое подходящая структура именования для хранения пакетов приложений?

    Миграция с Debian sid / нестабильная на тестирование

    bnx2: Не удается загрузить файл прошивки «bnx2 / bnx2-mips-09-6.2.1b.fw»

    Как проверить, что работает на сервере?

    Что делает fsck настолько медленным на больших файловых системах?

    Как правильно удалить нижний колонтитул с помощью hxremove?

    Как перенаправить порт с одной машины на другую?

    Кактусы перестали работать после обновления до растяжки

    Значки панели инструментов не могут загружаться при запуске Emacs через xhost из FreeBSD в Ubuntu

    Как получить общие папки, работающие в Fedora 19 (guest) с помощью open-vm-tools?

    Linux и Unix - лучшая ОС в мире.