对bash脚本进行故障排除以将每个单词中的第一个字母大写

时间:2014-04-30 22:10:52

标签: linux bash

我有一个以下格式的文本文件:

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脚本,所以说我是绿色的是轻描淡写。

任何帮助都将不胜感激。

2 个答案:

答案 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

Converting string to lower case in Bash shell scripting