string - 更改每行第一个单词的大小写

标签 string bash awk uppercase

从命令行,如何将文本文件中一行的每个第一个单词更改为大写?

输入示例:

hello   world  
tell    me who you are!  

示例输出:

HELLO   world  
TELL    me who you are!  

没有空行,它是 ASCII,每行以一个字母单词开头,后跟一个制表符

使用的工具:任何可以在 ma​​cOS 上运行的工具(bash 3.2、BSD sed、awk、tr、perl 5、python 2.7、swift 4 等)。

最佳答案

您始终可以使用 bash 大小写转换和 while 循环来完成您的意图,例如

$ while read -r a b; do echo "${a^^} $b"; done < file
HELLO world
HOW are you?

参数扩展 ${var^^}var 中的所有字符转换为大写,${var^} 转换第一个字母。

Bash 3.2 - 'tr'

对于早期的 bash,您可以使用与 tr 相同的设置以及 herestring 来处理大小写转换:

$ while read -r a b; do echo "$(tr [a-z] [A-Z] <<<"$a") $b"; done file
HELLO world
HOW are you?

保留 \t 字符

要保留制表符分隔的单词,您必须防止在读取过程中进行单词分割。不幸的是,read-d 选项不允许终止一组字符。检查 spacetab 分隔单词的一种方法是读取整行,使用 IFS= 禁用分词,然后向前扫描直到找到第一个文字 $' '$'\t' 为止。 (文字仅适用于 bash,而非 POSIX shell)一个简单的实现是:

while IFS= read -r line; do 
    word=
    ct=0 
    for ((i = 0; i < ${#line}; i++)); do 
        ct=$i
        ## check against literal 'space' or 'tab'
        [ "${line:$i:1}" = $' ' -o "${line:$i:1}" = $'\t' ] && break 
        word="${word}${line:$i:1}"
    done
    word="$(tr [a-z] [A-Z] <<<"$word")" 
    echo "${word}${line:$((ct))}"
done <file

输出tab分隔单词

HELLO   world
HOW     are     you?

关于string - 更改每行第一个单词的大小写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46822330/

相关文章:

java - 字符串常量池和实习生

bash - 从 Vim 中执行 Bash 函数 - 我该怎么做?

linux - 解析日志并打印 csv 文件中的某些字段

linux - 合并两个没有伪重复的文件

linux - 使用 AWK 提取和存储具有不均匀空格的字符串

c# - 如何删除文本文件中具有奇数索引行和下一个偶数字符串的重复字符串并避免出现偶数

c# - 是否可以将泛型类型参数约束为字符串或数组

r - 根据列中的部分字符串匹配选择数据框行

linux - 在 crontab 中通过脚本打开 JPG 文件

arrays - 如何比较两个数组的内容?如果条件满足,我们如何指向数组之一上的特定线?