改变每行第一个单词的大小写

时间:2017-10-19 03:17:03

标签: string bash awk uppercase

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

示例输入:

hello   world  
tell    me who you are!  

示例输出:

HELLO   world  
TELL    me who you are!  

没有空行,它是ASCII,每行以字母词开头,后跟标签

要使用的工具:在 macOS (bash 3.2,BSD sed,awk,tr,perl 5,python 2.7,swift 4等)的命令行上运行的任何东西。

3 个答案:

答案 0 :(得分:2)

您可以随时使用bash case转换和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字符

要保留制表符分隔的单词,您必须在阅读过程中防止分词。不幸的是,-d的{​​{1}}选项不允许终止一组字符。检查readspaces分隔词的方法是读取整行,禁用与tab进行分词,然后向前扫描直到第一个文字{{1}找到IFS=$' '。 (文字只有bash,而不是POSIX shell)一个简单的实现是:

$'\t'

输出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

答案 1 :(得分:1)

使用awk one-liner:

awk -F$'\t' -v OFS=$'\t' '{ $1 = toupper($1) }1' file

答案 2 :(得分:1)

使用GNU sed

sed 's/^\S*/\U&/g' file

其中\S匹配非空白字符,\U&匹配匹配模式

更新:如果是BSD sed,因为它不支持大多数特殊字符,它仍然可行,但需要更长的表达

sed -f script file

脚本包含

{
    h
    s/ .*//
    y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/
    G
    s/\(.*\)\n[^ ]* \(.*\)/\1 \2/
}