заменить аргумент функции CamelCase на SNAKE_CASE - PullRequest
0 голосов
/ 24 ноября 2018

У меня есть огромное количество исходных файлов с инициализацией ctor, как показано ниже:

Foo::Foo(...) : Bar("CamelCaseArgument") {}

Я должен заменить «CamelCaseArgument» на CAMEL_CASE_ARGUMENT

Так что результат должен быть

Foo::Foo(...) : Bar(CAMEL_CASE_ARGUMENT) {}

Foo и CamelCaseArgument различаются, Bar - это имя класса, поэтому оно всегда одинаково и может использоваться в качестве элемента шаблона,

Эту задачу легко выполнить с помощью python / perl /php / etc, но мне было любопытно, если это можно сделать с помощью sed, моя первоначальная идея заключалась в том, чтобы использовать gnu sed в 2 раунда,

1) удаление "символов",

$ echo 'Foo::Foo() : Bar("CamelCaseArgument") {}' | sed -rne 's/(Bar.{1})(["])([[:alpha:]]*)(["])/\1\3/gip'
Foo::Foo() : Bar(CamelCaseArgument) {}

2)transforming CamelCaseArgument => CAMEL_CASE_ARGUMENT

Я не знаю, как вывести все совпадающие детали, а не только последнюю

Моя текущая (не работает) формула:

$ echo 'Foo::Foo() : Bar(CamelCaseArgument) {}' | sed -rn 's/Bar.{1}([A-Z][a-z]*)+/\0\U\1_/gp'
Foo::Foo() : Bar(CamelCaseArgument_ARGUMENT) {}

Ответы [ 3 ]

0 голосов
/ 25 ноября 2018

sed не предназначен для таких сложных задач, как использование perl, awk и т. Д.Так как вы попросили решение sed, но никто еще не придумал, я делюсь этим обходным путем.

$ cat file
Foo::Foo(...) : Bar("CamelCaseArgument") {}
Foo::Foo(...) : Bar("ThisIsATest") {}
Foo::Foo(...) : Baz("ThisIsATest") {}
Foo::Foo(...) : Bar("Camel") {}
Foo::Foo(...) : Bar("") {}
$
$ cat tst.sed
s/\<Bar("/Bar(\n/; t1; b
:1
    s/\n\([A-Z][a-z]*\)/\U\1_\n/; t1
# clean up
s/_\?\n"//
$
$ sed -f tst.sed file
Foo::Foo(...) : Bar(CAMEL_CASE_ARGUMENT) {}
Foo::Foo(...) : Bar(THIS_IS_A_TEST) {}
Foo::Foo(...) : Baz("ThisIsATest") {}
Foo::Foo(...) : Bar(CAMEL) {}
Foo::Foo(...) : Bar() {}
0 голосов
/ 25 ноября 2018

Это может работать для вас (GNU sed):

sed 's/\(Bar(\)"\([^"]\+\)"/\1\n\2\n/g;T;:a;s/_\n\n//g;ta;s/\n\([[:upper:]][[:lower:]]*\)/\U\1_\n/g;ta' file

Окружать любые непустые строки в двойных кавычках символами новой строки, перед которыми стоит Bar(.Выполните итерацию по указанным выше строкам, вставьте подчеркивание после строчных букв, а затем используйте строчные буквы (удаляя последнее подчеркивание и введенные символы новой строки).

0 голосов
/ 25 ноября 2018
perl -pe '
    s{"((?:[[:upper:]][[:lower:]]+){2,})"}{
        join "_", map {uc} ($1 =~ /[[:upper:]][[:lower:]]+/g)
    }eg
' <<END
Foo::Foo(...) : Bar("CamelCaseArgument") {}
END
Foo::Foo(...) : Bar(CAMEL_CASE_ARGUMENT) {}

Если вы хотите фильтровать по Bar, используйте это регулярное выражение:

Bar\(\K"((?:[[:upper:]][[:lower:]]+){2,})"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...