Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.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
C++ Sed删除下划线并提升字符_C++_Regex_Sed_Awk - Fatal编程技术网

C++ Sed删除下划线并提升字符

C++ Sed删除下划线并提升字符,c++,regex,sed,awk,C++,Regex,Sed,Awk,我正在尝试将一些代码从旧的命名方案迁移到新的命名方案旧的命名方案是: int some_var_name; 新的是 int someVarName_: 所以我想要的是某种形式的sed/regexy善良来简化这个过程。因此,从根本上说,需要做的是: 查找包含uu下划线的小写单词,并将u下划线右侧的字符升级为大写。在此之后,在比赛结束后附加一个u 是否可以使用Sed和/或Awk和regex执行此操作?若否,原因为何 如有任何脚本示例,将不胜感激 非常感谢您的帮助 编辑: 为了清楚起见,重命名适用

我正在尝试将一些代码从旧的命名方案迁移到新的命名方案旧的命名方案是:

int some_var_name;
新的是

int someVarName_:
所以我想要的是某种形式的sed/regexy善良来简化这个过程。因此,从根本上说,需要做的是:
查找包含uu下划线的小写单词,并将u下划线右侧的字符升级为大写。在此之后,在比赛结束后附加一个u

是否可以使用Sed和/或Awk和regex执行此操作?若否,原因为何

如有任何脚本示例,将不胜感激

非常感谢您的帮助

编辑:

为了清楚起见,重命名适用于许多使用错误命名约定编写的文件,需要与代码库的其余部分保持一致。这并不是一个完美的替换,让一切都处于可编译状态。相反,脚本将运行,然后手动查看是否存在任何异常。替换脚本纯粹是为了减轻手动更正所有内容的负担,我相信您也会同意这相当繁琐。

考虑使用sed来搜索和替换所有这样的文本。如果没有C++标记器来识别标识符(具体地说是标识符,而不是标准库中的标识符,例如),则被拧紧。push\u back将重命名为pushBack\u。映射::插入到映射::插入。映射到映射。基本字符串到基本字符串。printf到printf(如果您使用C库),等等。如果您不加区别地这样做,您将受到伤害

我不知道有任何现有的工具能够自动地将某个变量名重命名为某个变量名,而不会出现上述问题。人们投票否决这篇文章可能是因为他们不明白我在这里的意思。我不是说塞德做不到,我只是说它不会给你你想要的东西,只是按原样使用。解析器需要上下文信息来正确地完成这项工作,否则它将替换更多不应该替换的内容

如果解析器能够识别哪些标记是标识符(特别是您的标识符),那么就有可能编写一个解析器来实现这一点(例如:使用sed),但我怀疑是否有一个工具专门用于您想要做的事情,它可以在没有手动润滑的情况下立即完成(尽管我可能错了)。以这种方式对所有文本进行简单的搜索和替换会带来固有的问题

然而,VisualAssistX(它可以选择性地替换文档中的实例)或任何其他重构工具,能够智能地重命名每个实例的标识符,至少以这种方式大大减轻了重构代码的负担。如果您有一个名为some_var_name的符号,并且它在您的系统中被引用在上千个不同的地方,那么使用VAssistX,您只需使用一个重命名函数即可智能地重命名所有引用(这不仅仅是文本搜索和替换)

用VAX以这种方式重构100个变量可能需要15分钟到半小时(如果使用热键,速度会更快),但这肯定比使用文本搜索并替换为sed(如另一个答案中所述)以及替换所有不应替换的代码要好

[主观]顺便说一句:如果你问我的话,下划线仍然不属于驼色。lowerCamelCase命名约定应使用lowerCamelCase。关于这一点有很多有趣的论文,但至少你的惯例是一致的。如果它是一致的,那么这是一个巨大的优势,而不是像fooBar_Baz这样的东西,一些愚蠢的程序员认为它在某种程度上使规则的特殊例外变得更容易。[/主观的]

sed-re's,[a-z]+([a-z]+,&[u,g'-e,[a-z]),\u\1,g'

说明:

这是一个带有2个表达式的sed命令(每个表达式在a
-e
后面加引号)
s、、.g
是一个全局替换。通常用斜杠而不是逗号来表示,但我认为在模式中使用反斜杠(并且没有逗号)时,这更容易理解。尾随的g(表示“全局”)意味着将此替换应用于每行上的所有匹配项,而不仅仅是第一行

第一个表达式将在每个由一个小写单词(
[a-z]+
)组成的标记后面附加一个下划线,后跟一个由下划线(
([a-z]+)+
)分隔的非零个小写单词。我们将其替换为
&
,其中
&
表示“匹配的所有内容”,而
&
只是一个文字下划线。总之,这个表达式表示在每个下划线分隔的小写标记的末尾添加一个下划线

第二个表达式匹配模式
([a-z])
,其中
之间的所有内容都是捕获组。这意味着我们可以稍后将其称为
\1
(因为它是第一个捕获组。如果有更多,它们将是
\2
\3
,等等)。所以我们说在下划线后面匹配一个小写字母,记住这个字母

我们将其替换为
\u\1
,这是我们刚刚记住的字母,但它的大写字母是
\u


这段代码并不能巧妙地避免咀嚼
#包括
行或类似内容;它将用大写字母替换下划线后面的每个小写字母。

几年前,我成功地将一个已有23年历史的遗留代码库转换为camelCase。只花了两天时间。但也有一些挥之不去的影响,需要几个月的时间才能解决。这是一个很好的方式来烦扰你的同事编码

我相信一个简单、愚蠢、类似sed的方法是有好处的。据我所知,基于IDE的工具等无法:

  • 未通过#ifdef编译的更改代码
  • 更改注释中的代码
遗留代码必须是主要的
1) Generate a list of tokens that you wish to change, and manually edit.
2) For each token in that list, determine the new token.
3) Apply these changes to your code base.
4) Compile.
5) Double-check via a manual diff, and do a final clean-up.
cat *.[ch] | sed 's/\([_A-Za-z0-9][_A-Za-z0-9]*\)/\nzzz \1\n/g' | grep -w zzz | sed 's/^zzz //' | grep '_[a-z]' | sort -u > list1
st_atime
time_t
...
cat list1 | sed 's/\(.*\)/glob_sub "\\<\1\\>" xxxx_\1/;s/\(xxxx_.*\)_a/\1A/g;s/\(xxxx_.*\)_b/\1B/g;s/\(xxxx_.*\)_a/\1C/g;s/\(xxxx_.*\)_t/\1T/g' | sed 's/zzz //' > list2
glob_sub "\<st_atime\>" xxxx_stAtime
glob_sub "\<time_t\>" xxxx_timeT
#!/bin/csh
foreach file (`grep -l "$1" */*.[ch] *.[ch]`)
  /bin/mv -f $file $file.bak
  /bin/sed "s/$1/$2/g" $file.bak > $file
end
glob_sub "\<xxxx_timeT\>" time_t