Baklap4
Baklap4

Reputation: 4202

Sed capitalize first letter of word in key-value pair

I'm currently working on my karaoke files and i see a lot of Non capitalized words.

The .txt files are structured as a key-value pair and i was wondering how to capitalize the first letter of every value word.

Example txt:

#TITLE:fire and Water
#ARTIST:Some band
#CREATOR:yunho
#LANGUAGE:Korean
#EDITION:UAS
#MP3:2NE1 - Fire.mp3
#COVER:2NE1 - Fire.jpg
#VIDEO:2NE1 - Fire.avi
#VIDEOGAP:11.6
#BPM:595
#GAP:3860
F -4 4 16  I
F 2 4 16  go
F 8 6 16  by
F 16 4 16  the
F 22 6 16  name
F 30 4 16  of
F 36 10 16  C
F 46 10 16 L
F 58 6 16  of
F 66 5 16  2
F 71 3 16 N
F 74 4 16 E
F 78 18 16 1

I'd like to capitalize the words after the keys TITLE, ARTISTS, LANGUAGE and EDITION

so for the example txt:

#TITLE:**F**ire **A**nd **W**ater
#ARTIST:**S**ome **B**and
#CREATOR:yunho
#LANGUAGE:**K**orean
#EDITION:**U**AS
#MP3:2NE1 - Fire.mp3
#COVER:2NE1 - Fire.jpg
#VIDEO:2NE1 - Fire.avi
#VIDEOGAP:11.6
#BPM:595
#GAP:3860
F -4 4 16  I
F 2 4 16  go
F 8 6 16  by
F 16 4 16  the
F 22 6 16  name
F 30 4 16  of
F 36 10 16  C
F 46 10 16 L
F 58 6 16  of
F 66 5 16  2
F 71 3 16 N
F 74 4 16 E
F 78 18 16 1

Another thing is that i have loads of these txt's files all in designated directories. I want to run the program from the parent recursive for all *.txt files

Example directories:

Library/Some Band/Some Band - Some Song/some txt file.txt
Library/Some Band2/Some Band2 - Some Song/sometxtfile.txt
Library/Some Band3/Some Band3 - Some Song/some3333 txt file.txt

I've tried to do so with find . -name '*.txt' -exec sed -i command {} + but i got stuck on the search and replace with sed... anyone care to help me out?

Upvotes: 1

Views: 132

Answers (1)

anubhava
anubhava

Reputation: 785276

You can use this gnu-sed command to uppercase starting letter for matching lines:

sed -E '/^#(TITLE|ARTIST|LANGUAGE|EDITION):/s/\b([a-z])/\u\1/g' file

#TITLE:Fire And Water
#ARTIST:Some Band
#CREATOR:yunho
#LANGUAGE:Korean
#EDITION:UAS
#MP3:2NE1 - Fire.mp3
#COVER:2NE1 - Fire.jpg
#VIDEO:2NE1 - Fire.avi
#VIDEOGAP:11.6
#BPM:595
#GAP:3860
F -4 4 16  I
F 2 4 16  go
F 8 6 16  by
F 16 4 16  the
F 22 6 16  name
F 30 4 16  of
F 36 10 16  C
F 46 10 16 L
F 58 6 16  of
F 66 5 16  2
F 71 3 16 N
F 74 4 16 E
F 78 18 16

For find + sed command use:

find . -name '*.txt' -exec \
sed -E -i '/^#(TITLE|ARTIST|LANGUAGE|EDITION):/s/\b([a-z])/\u\1/g' {} +

Upvotes: 1

Related Questions