我所说的单词是指“由任意数量的空格或换行符分隔的字符串”。
样本数据
on a rabbit's burrowing in the forest:
a short tale
预期成绩
On a Rabbit's Burrowing in the Forest:
A Short Tale
注意:对于标题大小写,每个短语/句子的每个单词的第一个字母应大写。此后的每个单词都应以大写开头,除了小词a、in、the。我确实还希望保留空格和换行符。
减少测试用例
declare -a input
declare -a output
shopt -s extglob
IFS=
read -r -d '' input
for w in "${input[@]}"; do
if [[ $w = "@(a|in|the)" ]]; then
output+=( "$w" )
else
output+=( "${w@u}" )
fi
done
echo "${output[@]}"
这保留了空格和换行符,但它只转换第一个“单词”,而我想要除a、in和转换后的所有单词。
对于文本处理,请使用文本处理实用程序,而不是 bash 循环。要将一行上的第一个非空白序列以及除
a
,the
和之外的所有序列标题化in
,您可以使用perl
:如果输入可能包含非 ASCII 字符并且它们是 UTF-8 编码的,请添加该
-C
选项。例如:
(请注意上面的
fi
(U+FB01
LATIN SMALL LIGATURE FIf
) 字符,后面没有i
)这表明执行正确的操作
ucfirst
与将第一个字符转换为大写不同。如果我必须使用 shell,我宁愿使用 zsh:
我发现它比我系统上的 perl 慢大约 14 倍,而且它不能
fi
正确处理这个问题。然而,在将输入解码为文本并转换为大写时,它确实尊重区域设置。请注意,zsh 有一个标题大小写运算符 (
${(C)var}
),但它会变成foo-BAR-baz
不仅仅Foo-Bar-Baz
将非空白字符序列的第一个字符大写(Foo-BAR-baz
此处)。假设:
无论如何,您确实需要更新您的问题以澄清,但这可能会帮助您实现您想要的目标。