我正在尝试使用sed来更改
等表达式my-word-now
到
my-Word-Now
即。将连字符后的任何单词大写,而不是连字符前的第一个单词。可以有任意数量的连字符。
我试图在mac的bash shell上执行此操作,我相信不支持/ u用于sed大写。所以我试试perl。
我能得到的最接近的是:
echo my word now | perl -pe 's/\S+/\u$&/g'
它给了我My Word Now
但如果我尝试:
echo my-word-now | perl -pe 's/\-+/\u$&/g'
它只是给了我:my-word-now
任何提示?
答案 0 :(得分:3)
试试这个:
s/-\K(\w)/\U$1/g
(或跳过括号,只使用$&如果这是oneliner的话)。
注意\ U大写; \ u titlecases,这有点不同。
答案 1 :(得分:2)
替换s/\S+/\u$&/g
匹配所有非空格字符,然后用大写的第一个字母替换它们。使用捕获更清晰地写,这将是s/(\S+)/\u$1/g
。
替换s/\-+/\u$&/g
匹配所有连字符序列,然后尝试大写这些连字符!连字符没有大写形式,因此不起作用。
更好的解决方案:让我们在每个连字符(?<=-)
后面匹配,然后捕获单个字母(\w)
,并用大写形式替换该字母:\u$1
。一起:
s/(?<=-)(\w)/\u$1/g