Я хотел бы повторно использовать этот код awk , чтобы правильно использовать заглавные буквы некоторых аудиофайлов. Этот код не только использует заглавные буквы, но и следует некоторым правилам использования заглавных букв, как описано в связанном вопросе.
Проблема состоит в том, как изменить этот код, чтобы использовать заглавные буквы только для строк "TITLE" и не весь файл. Например, с этим простым листом подсказки:
FILE "Two The Beatles Songs.wav" WAVE
TRACK 01 AUDIO
TITLE "dig A pony"
PERFORMER "The Beatles"
INDEX 01 00:00:00
TRACK 02 AUDIO
TITLE "from me to you"
PERFORMER "The Beatles"
INDEX 01 03:58:02
И с простым для l oop плюс код awk, например, что-то вроде этого:
#!/bin/sh
for cue_file in *.cue
do
awk 'BEGIN{split("a the to at in on with and but or",w); for(i in w)nocap[w[i]]}function cap(word){return toupper(substr(word,1,1)) tolower(substr(word,2))}{for(i=1;i<=NF;++i){printf "%s%s",(i==1||i==NF||!(tolower($i) in nocap)?cap($i):tolower($i)),(i==NF?"\n":" ")}}' "$cue_file" > ~/temp_cue_file && mv ~/temp_cue_file "$cue_file"
done
Результат после запуск сценария должен быть:
FILE "Two The Beatles Songs.wav" WAVE
TRACK 01 AUDIO
TITLE "Dig a Pony"
PERFORMER "The Beatles"
INDEX 01 00:00:00
TRACK 02 AUDIO
TITLE "From Me to You"
PERFORMER "The Beatles"
INDEX 01 03:58:02
То есть TITLE "Dig a Pony"
вместо TITLE "dig A pony"
. И TITLE "From Me to You"
вместо TITLE "from me to you"
.
Запрос:
- Как объяснялось ранее, сценарий оболочки должен изменять только строки TITLE (все из них), а не остальные.
- Сценарий оболочки должен запускаться под оболочкой POSIX sh. В моем случае FreeBSD.
- Будет полезен однострочный код awk.
Чтобы следовать тем же «правилам прописной буквы» , что и для связанного вопроса (и что предоставленный awk следует). То есть:
- С заглавными буквами все слова, за исключением:
- Строчные все статьи (a, the), предлоги (to, in, with) и координационные союзы ( и, но, или)
- С заглавной буквы первого и последнего слова в названии, независимо от части речи
Как можно адаптировать код awk к получить этот результат?
Спасибо.
Предыдущий однострочный код awk, кажется расширенным в связанном ответе:
BEGIN { split("a the to at in on with and but or", w)
for (i in w) nocap[w[i]] }
function cap(word) {
return toupper(substr(word,1,1)) tolower(substr(word,2))
}
{
for (i=1; i<=NF; ++i) {
printf "%s%s", (i==1||i==NF||!(tolower($i) in nocap)?cap($i):tolower($i)),
(i==NF?"\n":" ")
}
}