Как изменить все строки в файле 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'] 

  • Как ускорить работу скрипта на основе поиска grep?
  • sed: многострочная замена блока конфигурации
  • Как разбирать сотни html файлов исходного кода в оболочке?
  • Декодирование кодировки URL (процентное кодирование)
  • Использование 'sed' для поиска и замены
  • Использование CSV-строки в качестве параметров команды
  • Сопоставьте начало линии с чем-то там?
  • Помощь с повторением поля A в CSV-файле, где поле B имеет указанное значение
  • 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

    Как я могу настроить SELinux, когда команда semanage не найдена?

    Почему мой супервизор не запускается при перезагрузке?

    Посмотрите, какой файл использует postfix

    Как загрузить файл, а затем проверить его и запустить некоторые другие команды, используя только ssh, cat и diff в одном сеансе SSH?

    Ожидаемый сценарий, кажется, игнорирует приглашение (подтверждение отпечатка RSA)

    Как настроить двухканальные мониторы с драйверами Nvidia и одним монитором?

    Почему rm медленно?

    Есть ли способ найти файл в обратном рекурсивном поиске?

    Ключи для управляющих кодов ASCII

    не может подключиться к mysql как администратору извне

    Есть ли способ скрыть потоки ядра из результатов команды ps?

    Доступ к исходному содержимому точки монтирования

    Как эффективно искать журналы электронной почты с помощью `RegEx`

    Проблема с кодировкой: приложения Qt удаляют все символы без ASCII из файлов

    Как запускать параллельные процессы и комбинировать выходные данные, когда оба завершены

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