REGEXP:以数字开头的单词的首字母大写

bob*_*nte 2 regex awk sed

我想找到一种方法来将数字开头的单词的首字母大写。

输入:

2019donaldtrump
03012019paris
Run Code Online (Sandbox Code Playgroud)

预期结果:

2019Donaldtrump
03012019Paris
Run Code Online (Sandbox Code Playgroud)

有没有办法修改此命令

sed -e 's/^\(.\)/\U\1/g'
Run Code Online (Sandbox Code Playgroud)

使它寻找单词的第一个实际字母?

非常感谢

Sea*_*ght 5

这似乎可以满足您在测试中的要求:

sed -e 's/\([[:digit:]]\)\([a-z]\)/\1\U\2/g' input.txt
Run Code Online (Sandbox Code Playgroud)

输入:

2019donaldtrump
03012019paris
Run Code Online (Sandbox Code Playgroud)

输出:

2019Donaldtrump
03012019Paris
Run Code Online (Sandbox Code Playgroud)

编辑:Toto所指出的,分组实际上并不是必需的:

sed -e 's/[[:digit:]][a-z]/\U\0/g' input.txt
Run Code Online (Sandbox Code Playgroud)


Jam*_*own 5

awk 中的一个:

$ awk 'BEGIN{FS=OFS=""}/^[0-9]/ && match($0,/[a-z]/){$RSTART=toupper($RSTART)}1' file
Run Code Online (Sandbox Code Playgroud)

输出:

2019Donaldtrump
03012019Paris
notstartingwith123
Run Code Online (Sandbox Code Playgroud)

解释:

$ awk 'BEGIN {
    FS=OFS=""                     # separators to empty
}
/^[0-9]/ && match($0,/[a-z]/) {   # if there is starting digit and lower case letters
    $RSTART=toupper($RSTART)      # capitalize the first letter
}1' file                          # output
Run Code Online (Sandbox Code Playgroud)

更短,asmatch将作为其值返回RSTART,存储并使用它:

$ awk 'BEGIN{FS=OFS=""}/^[0-9]/&&r=match($0,/[a-z]/){$r=toupper($r)}1' file
Run Code Online (Sandbox Code Playgroud)