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
-1+小写ASCII字母[a-z]+
-一个或多个出现的(?:[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
-第1组:小写字母后跟0+个字母([a-z][a-Za-z]*)
-下划线。
-第2组:([a-z]+([a-z]+)*\(\)
-1+小写字母后跟[a-z]+
-0或更多次出现下划线,然后出现1+个小写字母,然后后跟([a-z]+)*
-一个子串()
-成功更换时,跳到标签ta
位置a
这是我的任务()
改为这是我的任务()
,而不是这是任务()
sed -E ':a; s/\b([[:lower:]][[:alpha:]]*)_([[:lower:]]+(_[[:lower:]]+)*\(\))/\1\u\2/; ta' file.c