У меня есть огромное количество исходных файлов с инициализацией 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) {}