【发布时间】:2020-04-20 19:17:57
【问题描述】:
我想重用 this awk code,正确大写一些提示表音频文件。此代码不仅将所有单词大写,而且遵循一些大写规则,如链接问题中所述。
问题是如何修改此代码以大写只大写“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
还有一个简单的 for 循环加上 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"。
请求是:
- 如前所述,shell 脚本必须仅更改 TITLE 行(全部),而不能更改其余部分。
- shell 脚本必须在 POSIX sh shell 下运行。就我而言,FreeBSD。
- 如果有单行 awk 代码将不胜感激。
-
遵循相同的“大写规则”as the linked question(并遵循提供的 awk)。那就是:
- 将所有单词大写,以下情况除外:
- 小写所有冠词 (a, the)、介词 (to、at、in、with) 和并列连词 (and, but, or)
- 无论词性如何,标题中的第一个和最后一个单词都大写
如何调整 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":" ")
}
}
【问题讨论】:
-
您是否努力理解最初发布的代码并尝试针对您的用例进行修改?
-
是的,我做到了,但没有成功。我有 awk 的经验。
标签: awk