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

Regex 使用sed更改表达式模式的特定部分,regex,sed,Regex,Sed,如何更改文件中的所有字符串,这些字符串具有以下模式:小写字母序列由一个下划线分隔,最后一个序列后面是括号。我需要把它改成序列,而不是 由下划线和下划线后的任何字母分隔是否更改为大写字母 例如:这是我的任务()更改为这是任务()。我需要和塞德一起做 但程序不应更改如下字符串:这是我的任务(),因为一行中有4个下划线 程序不应更改这些字符串:\uuuuuu这是我的任务()或者,因为第一个字符串的开头有下划线 我尝试过这样做:sed-r/([a-z]+)\([a-z]+)\(\)/\1\u\2()/'

如何更改文件中的所有字符串,这些字符串具有以下模式:小写字母序列由一个下划线分隔,最后一个序列后面是括号。我需要把它改成序列,而不是 由下划线和下划线后的任何字母分隔是否更改为大写字母

例如:
这是我的任务()
更改为
这是任务()
。我需要和塞德一起做

但程序不应更改如下字符串:
这是我的任务()
,因为一行中有4个下划线

程序不应更改这些字符串:
\uuuuuu这是我的任务()
或者,因为第一个字符串的开头有下划线


我尝试过这样做:
sed-r/([a-z]+)\([a-z]+)\(\)/\1\u\2()/'file.c
,但这只会将其更改为
this\u is\u myTask()

最好的方法是使用Perl:

perl -pe 's{\b[a-z]+(?:_[a-z]+)+\(\)}{$&=~s/_([a-z])/\u$1/gr}ge' file.c
请参见和,它匹配

  • \b
    -单词边界
  • [a-z]+
    -1+小写ASCII字母
  • (?:[a-z]+)+
    -一个或多个出现的
    和1+小写ASCII字母
  • \(\)
    -a
    ()
    子字符串
一旦存在匹配,匹配值(
$&
)将使用
([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

详细信息

  • :a
    -使用名称
    a
  • s/\b([a-z][a-Za-z]*)\uz([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组中第一个字符的值变为上限

  • ta
    -成功更换时,跳到标签
    a
    位置

考虑重新格式化为多个段落/代码块。此外,尚不清楚“”中的分隔符是什么,但这也将格式化字符串,如\u is\u my\u\u\u\u task(),其中一行有四个下划线。我需要的程序将格式化只有一个下划线分隔的字符串。我在一个问题中更正了这个信息。sorry@Student这是正则表达式中的一个小调整。请参阅更新的答案。我不同意此downvote,downvoter应说明原因IMHO。如何更改表达式,以便不会重新生成第一个序列中有大写字母或开头有下划线的字符串?我在问题中加了一些例子description@WiktorStribiżew这将把字符串
这是我的任务()
改为
这是我的任务()
,而不是
这是任务()
sed -E ':a; s/\b([[:lower:]][[:alpha:]]*)_([[:lower:]]+(_[[:lower:]]+)*\(\))/\1\u\2/; ta' file.c