繁体   English   中英

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

[英]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

在Bash Shell脚本中将字符串转换为小写

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM