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

标签 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 脚本,所以说我是新手是轻描淡写的说法。

如有任何帮助,我们将不胜感激。

最佳答案

正如我在 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/

相关文章:

json - JQ 从编码字段内部替换 "\n"

bash - 使用sed在指定位置替换大于指定数的数

linux - 在 TLB 访问中设置断点

r - 加载共享库时出错 : libicuuc. so.50

linux - 转义空格的 Unix 命令

linux输出通过主机名grep一个内部ip

python - 使用Python向 super 计算机提交多个作业

bash - 如何在shell脚本中进入文件夹并进行操作

bash - 是否可以将多个流的内容输出到终端中的单独列中?

linux - 如何修复此 Bash 函数以从指定路径开始并递归列出其子目录以及这些目录的子目录等