[英]Troubleshooting bash script to capitalize first letter in every word
我有以下格式的文本文件:
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
与第一个字母大写小写。 好消息是,这也适用于数组的每个字段。
注意。 您不清楚是否需要在一行的每个单词或每一行上应用它 。 以下内容解决了一行中每个单词的问题。 请参阅史蒂文·潘妮的答案以仅处理每一行。
以更好的样式在这里走!
#!/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
并回显它即可。
declare -c rw
mapfile -t rw < names.txt
printf '%s\n' "${rw[@]}"
结果
Jay Jay Jay Evans Evans Evans
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.