使用sed更改表达模式的特定部分

时间:2019-10-16 13:55:06

标签: regex sed

如何更改文件中具有以下格式的所有字符串:用小写字母组成的序列,用一个下划线分隔,最后一个序列后是括号。我需要将其更改为序列,而不是 用下划线分隔,下划线后的任何字母都变为大写字母?

例如:this_is_my_task()更改为thisIsMyTask()。我需要用sed来做。

但是该程序不应更改诸如this_is____my_task()之类的字符串,因为连续有4个下划线。

程序不应更改以下字符串:___this_is_my_task(),或者因为第一个字符串的开头带有下划线。

我已经尝试过:sed -r 's/([a-z]+)_([a-z]+)\(\)/\1\u\2()/' file.c,但这只会将其更改为this_is_myTask()

1 个答案:

答案 0 :(得分:0)

最好的方法是使用Perl:

perl -pe 's{\b[a-z]+(?:_[a-z]+)+\(\)}{$&=~s/_([a-z])/\u$1/gr}ge' file.c

请参见online demofirst regex demo,它们匹配

  • \b-单词边界
  • [a-z]+-1个以上的小写ASCII字母
  • (?:_[a-z]+)+-一个或多个_和1+个小写ASCII字母
  • \(\)-一个()子字符串。

一旦存在匹配项,则使用$&模式(_([a-z]),然后是第1组中的小写字母)替换匹配值(_),并用大写字母替换(\u$1

使用sed,您可以使用

sed -E ':a; s/\b([a-z][A-Za-z]*)_([a-z]+(_[a-z]+)*\(\))/\1\u\2/; ta' file.c

sed -E ':a; s/\b([[:lower:]][[:alpha:]]*)_([[:lower:]]+(_[[:lower:]]+)*\(\))/\1\u\2/; ta' file.c

请参见online demo

详细信息

  • :a-设置标签名称为a
  • s/\b([a-z][A-Za-z]*)_([a-z]+(_[a-z]+)*\(\))/\1\u\2/-替换

    • \b-单词边界
    • ([a-z][A-Za-z]*)-第1组:小写字母,后跟0+个字母
    • _-下划线
    • ([a-z]+(_[a-z]+)*\(\))-第2组:
      • [a-z]+-1个小写字母,后跟
      • (_[a-z]+)*-出现0个或更多下划线,然后出现1+个小写字母,然后跟着
      • ()-一个()子字符串

    第1组和第2组的值,第2组中的第一个字符变为高位

  • ta-成功替换后,跳转到标签a的位置。
相关问题