Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 用SNAKE_CASE替换CamelCase函数参数_Regex_Sed - Fatal编程技术网

Regex 用SNAKE_CASE替换CamelCase函数参数

Regex 用SNAKE_CASE替换CamelCase函数参数,regex,sed,Regex,Sed,我有大量的源文件,其ctor初始化如下: Foo::Foo(...) : Bar("CamelCaseArgument") {} 我必须用CAMEL\u CASE\u参数替换camelcase参数 所以结果应该是 Foo::Foo(...) : Bar(CAMEL_CASE_ARGUMENT) {} Foo和CamelCaseArgument是不同的,Bar是一个类名,所以它总是相同的,可以用作模式元素 使用python/perl/php/etc可以很容易地完成这项任务,但我很好奇这是否可以

我有大量的源文件,其ctor初始化如下:

Foo::Foo(...) : Bar("CamelCaseArgument") {}
我必须用CAMEL\u CASE\u参数替换camelcase参数

所以结果应该是

Foo::Foo(...) : Bar(CAMEL_CASE_ARGUMENT) {}
Foo和CamelCaseArgument是不同的,Bar是一个类名,所以它总是相同的,可以用作模式元素

使用python/perl/php/etc可以很容易地完成这项任务,但我很好奇这是否可以用sed处理, 我最初的想法是在两轮中使用gnu sed

1.清除炭

$ echo 'Foo::Foo() : Bar("CamelCaseArgument") {}' | sed -rne 's/(Bar.{1})(["])([[:alpha:]]*)(["])/\1\3/gip'
Foo::Foo() : Bar(CamelCaseArgument) {}
2转换CamelCaseArgument=>CAMEL\u CASE\u参数

我不知道如何输出所有匹配的部分,不仅仅是最后一个

我的当前非工作公式:

$ echo 'Foo::Foo() : Bar(CamelCaseArgument) {}' | sed -rn 's/Bar.{1}([A-Z][a-z]*)+/\0\U\1_/gp'
Foo::Foo() : Bar(CamelCaseArgument_ARGUMENT) {}
如果要在条形图上进行筛选,请使用以下正则表达式:

Bar\(\K"((?:[[:upper:]][[:lower:]]+){2,})"
如果要在条形图上进行筛选,请使用以下正则表达式:

Bar\(\K"((?:[[:upper:]][[:lower:]]+){2,})"

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() {}

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() {}

这可能适用于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

在任何非空的双引号字符串周围加上以条开头的换行符。遍历上述字符串,在所有小写字母后插入下划线,然后将字符串大写,删除最后一个下划线和引入的换行符。

这可能适用于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

在任何非空的双引号字符串周围加上以条开头的换行符。遍历上述字符串,在所有小写字母后插入下划线,然后将字符串大写,删除最后一个下划线和引入的换行符。

请注意,您要执行此操作的是固定字符串吗?或者我们有一些条件,字符串也可以是任何其他字符串,请确认一下?正如在问题描述中,Foo和camelcase参数是不同的,。。。CAMELCASE参数随每个文件而变化,只有Bar是固定的。请注意,您想执行此操作的是固定字符串吗?或者我们有一些条件,字符串也可以是任何其他字符串,请确认一下?正如在问题描述中,Foo和camelcase参数是不同的,。。。camelcase参数随着每个文件的变化而变化,只有Bar是固定的:perl-pe的{?:[A-Z][A-Z]+{2,}{join},map{uc}$1=~/[A-Z][A-Z]+/g}例如'golf:perl-pe的{?:[A-Z][A-Z]+{2,}{join},map{uc 1=/[A-Z][A-Z]+/g}eg'