我有一个以下格式的文本文件:
jAY
JAY
JaY
eVAns
Evans
Evans
我要做的是将所有内容转换为小写,然后将每个单词的第一个字母大写。但是,对于我的脚本,我没有打印出正确的信息。
#!/bin/bash
FILE=names.txt
echo "#################################"
k=1
while read line;do
VAR=$line
VARCAP=$( echo "${VAR}" | tr '[A-Z]' '[a-z]')";
VARCAP1=$( echo "${VARCAP}" | awk '{for(i=1;i<=NF;i++)sub(/./,toupper(substr($i,1,1)),$i)}1')
echo "Line # $k: $VARCAP1"
((k++))
done < $FILE
echo "Total number of lines in file: $k"
一切正常,直到我添加了将所有字母转换为小写的行 - 这就是我的问题所在。这是我写过的第一个bash脚本,所以说我是绿色的是轻描淡写。
任何帮助都将不胜感激。
答案 0 :(得分:4)
正如我在OP的评论中所说,你可以使用(在Bash≥4中)以下内容:
${var,,}
${var^}
分别以小写字母var
和小写字母var
扩展,首字母大写。好消息是,这也适用于阵列的每个字段。
注意。您不清楚是否需要在行的每个字或每个行上应用此功能。以下解决了一行中每个单词的问题。请参阅Steven Penny的答案,仅处理每一行。
在这里,您将以更好的风格前进!
#!/bin/bash
file=names.txt
echo "#################################"
k=1
while read -r -a line_ary;do
lc_ary=( "${line_ary[@],,}" )
echo "Line # $k: ${lc_ary[@]^}"
((++k))
done < "$file"
echo "Total number of lines in file: $k"
首先,我们将每一行读作数组line_ary
(每个字段都是一个单词)。
部分lc_ary=( "${line_ary[@],,}" )
将line_ary
的每个字段转换为全部小写,并将生成的数组存储到lc_ary
。
我们现在只需将^
应用于数组lc_ary
并回复它。
答案 1 :(得分:1)
declare -c rw
mapfile -t rw < names.txt
printf '%s\n' "${rw[@]}"
结果
Jay Jay Jay Evans Evans Evans