每行第一个字母大写

Mat*_*ins -1 regex unix linux terminal sed

我有一个如下所示的列表:

david
Sam
toNy
3matt
5$!john
Run Code Online (Sandbox Code Playgroud)

我希望将每行中第一次出现的字母大写。因此,如果该行不以字母开头,则转到下一个可能的字母并将其变为大写。所以上面的例子应该输出:

David
Sam
ToNy
3Matt
5$!John
Run Code Online (Sandbox Code Playgroud)

我已尝试以下操作,但如果该行以数字或符号开头,则它不会将第一次出现的字母大写:

sed  's/^\(.\)/\U\1/' myfile.txt > convertedfile.txt
Run Code Online (Sandbox Code Playgroud)

我已经在这个网站上搜索了答案,它们都给出了与上面一行相同的问题

Wik*_*żew 8

您可以使用

sed 's/[[:alpha:]]/\U&/' myfile.txt > convertedfile.txt
Run Code Online (Sandbox Code Playgroud)

在这里,s/[[:alpha:]]/\U&/找到第一个字母(带有[[:alpha:]]),并用运算符将​​其大写\U&代表整个匹配,匹配的字母)。由于没有/g标志,因此只有第一次出现(每行)受到影响。

请参阅在线演示

s='david
Sam
toNy
3matt
5$!john'
sed 's/[[:alpha:]]/\U&/' <<< "$s"
Run Code Online (Sandbox Code Playgroud)

输出:

David
Sam
ToNy
3Matt
5$!John
Run Code Online (Sandbox Code Playgroud)