如何更改文件中具有以下格式的所有字符串:用小写字母组成的序列,用一个下划线分隔,最后一个序列后是括号。我需要将其更改为序列,而不是 用下划线分隔,下划线后的任何字母都变为大写字母?
例如: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()
答案 0 :(得分:0)
最好的方法是使用Perl:
perl -pe 's{\b[a-z]+(?:_[a-z]+)+\(\)}{$&=~s/_([a-z])/\u$1/gr}ge' file.c
请参见online demo和first 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
的位置。