我有一个以下格式的文本文件:
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 脚本,所以说我是新手是轻描淡写的说法。
如有任何帮助,我们将不胜感激。
最佳答案
正如我在 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
并回显它。
关于linux - 对 bash 脚本进行故障排除以将每个单词的首字母大写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23398905/